None
Для золотодобывающего горно-обогатительного комбината (ГОК) требуется улучшить производственный процесс, чтобы снизить издержки. Построим модель машинного обучения, которая поможет оптимизировать процесс обогащения золота в золотосодержацих рудах.
Нам предоставлены данные с параметрами добычи руды и многоступенчатой очистки золота.
Шаги для выполнения проекта:
Когда добытая руда проходит первичную обработку, получается дроблёная смесь. Её отправляют на флотацию (обогащение) и двухэтапную очистку. Опишем каждую стадию:
1.Флотация.
Во флотационную установку подаётся смесь золотосодержащей руды. После обогащения получается черновой концентрат и «отвальные хвосты», то есть остатки продукта с низкой концентрацией ценных металлов. На стабильность этого процесса влияет непостоянное и неоптимальное физико-химическое состояние флотационной пульпы (смеси твёрдых частиц и жидкости).
2.Очистка.
Черновой концентрат проходит две очистки. На выходе получается финальный концентрат и новые отвальные хвосты.
Параметры этапов:
Данные геологоразведки трёх регионов находятся в файлах:
Данные индексируются датой и временем получения информации (признак date). Соседние по времени параметры часто похожи.
Некоторые параметры недоступны, потому что замеряются и/или рассчитываются значительно позже. Из-за этого в тестовой выборке отсутствуют некоторые признаки, которые могут быть в обучающей. Также в тестовом наборе нет целевых признаков.
Исходный датасет содержит обучающую и тестовую выборки со всеми признаками.
В нашем распоряжении сырые данные: их просто выгрузили из хранилища. Прежде чем приступить к построению модели, проверьте по нашей инструкции их на корректность.
Подготовить прототип модели машинного обучения для компании «Цифра».
Модель должна предсказать коэффициент восстановления золота из золотосодержащей руды и поможет оптимизировать производство, чтобы не запускать предприятие с убыточными характеристиками.
Для прогноза коэффициента нужно найти долю золота в концентратах и хвостах. Причём важен не только финальный продукт, но и черновой концентрат.
1.Подготовить данные:
1.1. Открыть файлы:
и изучить их.
1.2. Проверить, что эффективность обогащения рассчитана правильно. Вычислить её на обучающей выборке для признака rougher.output.recovery. Найти MAE между нашими расчётами и значением признака. Описать выводы.
Смоделировать процесс восстановления золота из золотосодержащей руды. Эффективность обогащения рассчитывается по формуле:
где:
1.3. Проанализировать признаки, недоступные в тестовой выборке. Что это за параметры? К какому типу относятся?
1.4. Провести предобработку данных.
2. Проанализировать данные:
2.1. Посмотреть, как меняется концентрация металлов (Au, Ag, Pb) на различных этапах очистки. Описать выводы.
2.2. Сравнить распределения размеров гранул сырья на обучающей и тестовой выборках. Если распределения сильно отличаются друг от друга, оценка модели будет неправильной.
2.3. Исследовать суммарную концентрацию всех веществ на разных стадиях: в сырье, в черновом и финальном концентратах.
3. Построить модель:
3.1. Написать функцию для вычисления итоговой sMAPE.
3.2. Обучить разные модели и оценить их качество кросс-валидацией. Выбрать лучшую модель и проверить её на тестовой выборке. Описать выводы.
Наименование признаков должно быть такое:
[этап].[тип_параметра].[название_параметра] Пример: rougher.input.feed_ag Возможные значения для блока [этап]:
Возможные значения для блока [тип_параметра]:
Целевой признак:
Нужно спрогнозировать сразу две величины:
Эффективность обогащения чернового концентрата rougher.output.recovery.
Эффективность обогащения финального концентрата final.output.recovery.
Итоговая метрика складывается из двух величин:
Для решения задачи введём новую метрику качества — sMAPE (англ. Symmetric Mean Absolute Percentage Error, «симметричное среднее абсолютное процентное отклонение»).
Она похожа на MAE, но выражается не в абсолютных величинах, а в относительных. Почему симметричная? Она одинаково учитывает масштаб и целевого признака, и предсказания.
Метрика sMAPE вычисляется так:
#!pip install skimpy
#!pip install pyod
# Все import соберем в начале проекта:
import warnings
warnings.filterwarnings('ignore')
import matplotlib
%matplotlib inline
import pandas as pd
import seaborn as sns
import numpy as np
from scipy import stats as st
from skimpy import skim
import matplotlib.pyplot as plt
from numpy.random import RandomState
from tqdm.auto import tqdm
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, make_scorer, \
mean_absolute_error
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.dummy import DummyRegressor
RANDOM_FIX_NUMBER = 12345 # Введем глобальную переменную для значения random_state
STATE = np.random.RandomState(RANDOM_FIX_NUMBER)
NUM_CIRCLE_BOOTATRAP = 1000
# Не ограничиваем максимальное количество отображающихся столбцов
pd.set_option('display.max_columns', None)
# Сброс ограничений на количество выводимых рядов
pd.set_option('display.max_rows', None)
# Сброс ограничений на количество символов в записи
pd.set_option('display.max_colwidth', None)
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой;
pd.set_option('display.float_format', '{:.3f}'.format)
# вернуть настройки к дефолтным:
# pd.reset_option('all')
%config InlineBackend.figure_format = 'svg'
# Создадим функцию для печати строки символов.
# Так будем разделять информацию между различными датасетами.
def Separating_line():
print('-' * 80)
Задачи:
1.Открыть файлы:
и изучить их.
2.Проверить, что эффективность обогащения рассчитана правильно. Вычислить её на обучающей выборке для признака ougher.output.recovery. Найти MAE между нашими расчётами и значением признака. Описать выводы.
3.Проанализировать признаки, недоступные в тестовой выборке. Что это за параметры? К какому типу относятся?
4.Провести предобработку данных.
Изучили файлы с предоставленными данными
и решили использовать символ запятая для разделения данных:
files_name = ['gold_recovery_full_new.csv', 'gold_recovery_train_new.csv', 'gold_recovery_test_new.csv']
data_names = ['full', 'train', 'test']
data = {} # пустой словарь для датасетов
try:
for n_file in range(len(files_name)):
dataset_local_path = 'datasets/' + files_name[n_file]
data[data_names[n_file]] = pd.read_csv(dataset_local_path, sep=',')
print('Local datasets is loaded successfully.')
except:
for n_file in range(len(files_name)):
dataset_remote_path = 'https://code.s3.yandex.net/datasets/' + files_name[n_file]
data[data_names[n_file]] = pd.read_csv(dataset_remote_path, sep=',')
print('Remote datasets is loaded successfully.')
Local datasets is loaded successfully.
Посмотрим, объем данных находящихся в изучаемых файлах и сохраним размеры исходных датасетов в словарик для последующего использования.
initial_size = {}
for key_df in data:
print("Размер датасета data '", key_df, "': ", data[key_df].shape, sep='', end=' ')
print(f"= {data[key_df].size:_.0f}.")
initial_size[key_df] = data[key_df].shape[0]
Размер датасета data 'full': (19439, 87) = 1_691_193. Размер датасета data 'train': (14149, 87) = 1_230_963. Размер датасета data 'test': (5290, 53) = 280_370.
Отметим:
Как указано в задании: "Некоторые параметры недоступны, потому что замеряются и/или рассчитываются значительно позже. Из-за этого в тестовой выборке отсутствуют некоторые признаки, которые могут быть в обучающей."
Хорошо. Отсутствие в тестовой выборке некоторых признаков понятно. Посмотрим их позднее.
Изучим, какая информация содержится в столбцах:
for key_df in data:
print("\nИнформация по датасету data '", key_df, "':\n", data[key_df].sample(2))
Separating_line()
Информация по датасету data ' full ':
date final.output.concentrate_ag \
11934 2017-08-11 20:59:59 5.925
5380 2016-10-09 17:59:59 9.645
final.output.concentrate_pb final.output.concentrate_sol \
11934 14.765 6.664
5380 8.855 11.993
final.output.concentrate_au final.output.recovery \
11934 37.337 100.000
5380 38.343 68.376
final.output.tail_ag final.output.tail_pb final.output.tail_sol \
11934 0.000 0.000 0.000
5380 11.227 2.896 10.449
final.output.tail_au primary_cleaner.input.sulfate \
11934 0.000 NaN
5380 4.346 174.742
primary_cleaner.input.depressant primary_cleaner.input.feed_size \
11934 NaN 6.940
5380 6.981 8.000
primary_cleaner.input.xanthate primary_cleaner.output.concentrate_ag \
11934 NaN 0.000
5380 1.188 13.041
primary_cleaner.output.concentrate_pb \
11934 0.000
5380 9.885
primary_cleaner.output.concentrate_sol \
11934 0.000
5380 15.469
primary_cleaner.output.concentrate_au primary_cleaner.output.tail_ag \
11934 0.000 7.777
5380 26.193 11.493
primary_cleaner.output.tail_pb primary_cleaner.output.tail_sol \
11934 0.888 11.515
5380 1.139 10.951
primary_cleaner.output.tail_au primary_cleaner.state.floatbank8_a_air \
11934 6.367 1298.928
5380 4.805 1553.587
primary_cleaner.state.floatbank8_a_level \
11934 -798.577
5380 -499.542
primary_cleaner.state.floatbank8_b_air \
11934 1303.837
5380 1552.250
primary_cleaner.state.floatbank8_b_level \
11934 -500.265
5380 -499.988
primary_cleaner.state.floatbank8_c_air \
11934 1296.641
5380 1552.707
primary_cleaner.state.floatbank8_c_level \
11934 -799.439
5380 -499.379
primary_cleaner.state.floatbank8_d_air \
11934 1227.273
5380 1550.465
primary_cleaner.state.floatbank8_d_level \
11934 -500.349
5380 -499.935
rougher.calculation.sulfate_to_au_concentrate \
11934 -2403.665
5380 41358.794
rougher.calculation.floatbank10_sulfate_to_au_feed \
11934 -1.018
5380 2746.063
rougher.calculation.floatbank11_sulfate_to_au_feed \
11934 4.192
5380 2741.861
rougher.calculation.au_pb_ratio rougher.input.feed_ag \
11934 1.933 7.974
5380 2.717 11.321
rougher.input.feed_pb rougher.input.feed_rate \
11934 3.910 1.687
5380 4.063 372.565
rougher.input.feed_size rougher.input.feed_sol rougher.input.feed_au \
11934 31.471 NaN 7.557
5380 41.287 37.025 11.039
rougher.input.floatbank10_sulfate rougher.input.floatbank10_xanthate \
11934 NaN NaN
5380 12.003 7.201
rougher.input.floatbank11_sulfate rougher.input.floatbank11_xanthate \
11934 0.017 NaN
5380 11.998 7.196
rougher.output.concentrate_ag rougher.output.concentrate_pb \
11934 7.459 13.077
5380 13.347 6.567
rougher.output.concentrate_sol rougher.output.concentrate_au \
11934 6.789 13.791
5380 24.866 19.853
rougher.output.recovery rougher.output.tail_ag \
11934 83.407 5.783
5380 90.594 6.155
rougher.output.tail_pb rougher.output.tail_sol \
11934 1.049 18.154
5380 0.652 19.725
rougher.output.tail_au rougher.state.floatbank10_a_air \
11934 2.309 999.824
5380 2.092 1007.556
rougher.state.floatbank10_a_level rougher.state.floatbank10_b_air \
11934 -300.070 1298.352
5380 -499.581 1459.176
rougher.state.floatbank10_b_level rougher.state.floatbank10_c_air \
11934 -500.133 1301.793
5380 -400.325 1404.383
rougher.state.floatbank10_c_level rougher.state.floatbank10_d_air \
11934 -500.270 1200.604
5380 -398.814 1308.392
rougher.state.floatbank10_d_level rougher.state.floatbank10_e_air \
11934 -500.635 949.598
5380 -399.079 1051.594
rougher.state.floatbank10_e_level rougher.state.floatbank10_f_air \
11934 -499.164 949.542
5380 -399.039 952.281
rougher.state.floatbank10_f_level secondary_cleaner.output.tail_ag \
11934 -500.545 0.000
5380 -399.438 11.113
secondary_cleaner.output.tail_pb secondary_cleaner.output.tail_sol \
11934 0.000 0.000
5380 2.353 9.857
secondary_cleaner.output.tail_au \
11934 0.000
5380 4.527
secondary_cleaner.state.floatbank2_a_air \
11934 25.049
5380 25.105
secondary_cleaner.state.floatbank2_a_level \
11934 -500.095
5380 -499.357
secondary_cleaner.state.floatbank2_b_air \
11934 NaN
5380 21.062
secondary_cleaner.state.floatbank2_b_level \
11934 -499.761
5380 -500.443
secondary_cleaner.state.floatbank3_a_air \
11934 19.973
5380 24.981
secondary_cleaner.state.floatbank3_a_level \
11934 -500.097
5380 -500.276
secondary_cleaner.state.floatbank3_b_air \
11934 15.015
5380 21.990
secondary_cleaner.state.floatbank3_b_level \
11934 -499.960
5380 -499.049
secondary_cleaner.state.floatbank4_a_air \
11934 13.003
5380 11.996
secondary_cleaner.state.floatbank4_a_level \
11934 -498.172
5380 -500.711
secondary_cleaner.state.floatbank4_b_air \
11934 10.072
5380 11.890
secondary_cleaner.state.floatbank4_b_level \
11934 -399.561
5380 -500.949
secondary_cleaner.state.floatbank5_a_air \
11934 11.998
5380 9.383
secondary_cleaner.state.floatbank5_a_level \
11934 -499.612
5380 -490.942
secondary_cleaner.state.floatbank5_b_air \
11934 10.016
5380 6.970
secondary_cleaner.state.floatbank5_b_level \
11934 -482.374
5380 -496.929
secondary_cleaner.state.floatbank6_a_air \
11934 15.006
5380 18.985
secondary_cleaner.state.floatbank6_a_level
11934 -501.042
5380 -499.275
--------------------------------------------------------------------------------
Информация по датасету data ' train ':
date final.output.concentrate_ag \
8109 2017-06-19 21:59:59 3.784
7569 2017-05-24 08:59:59 5.891
final.output.concentrate_pb final.output.concentrate_sol \
8109 10.527 8.007
7569 11.804 12.510
final.output.concentrate_au final.output.recovery \
8109 47.133 61.180
7569 42.519 67.368
final.output.tail_ag final.output.tail_pb final.output.tail_sol \
8109 7.657 2.764 10.484
7569 10.300 3.703 10.357
final.output.tail_au primary_cleaner.input.sulfate \
8109 2.550 136.427
7569 3.528 166.007
primary_cleaner.input.depressant primary_cleaner.input.feed_size \
8109 12.013 7.700
7569 10.080 7.175
primary_cleaner.input.xanthate primary_cleaner.output.concentrate_ag \
8109 1.090 6.780
7569 0.402 8.462
primary_cleaner.output.concentrate_pb \
8109 10.866
7569 11.102
primary_cleaner.output.concentrate_sol \
8109 7.812
7569 9.534
primary_cleaner.output.concentrate_au primary_cleaner.output.tail_ag \
8109 36.279 14.548
7569 32.546 17.160
primary_cleaner.output.tail_pb primary_cleaner.output.tail_sol \
8109 2.745 7.520
7569 3.770 7.058
primary_cleaner.output.tail_au primary_cleaner.state.floatbank8_a_air \
8109 3.405 1698.244
7569 4.975 1764.393
primary_cleaner.state.floatbank8_a_level \
8109 -501.262
7569 -498.729
primary_cleaner.state.floatbank8_b_air \
8109 1700.340
7569 1750.597
primary_cleaner.state.floatbank8_b_level \
8109 -499.581
7569 -498.489
primary_cleaner.state.floatbank8_c_air \
8109 1699.624
7569 1751.052
primary_cleaner.state.floatbank8_c_level \
8109 -499.824
7569 -501.522
primary_cleaner.state.floatbank8_d_air \
8109 1698.073
7569 1752.105
primary_cleaner.state.floatbank8_d_level \
8109 -501.196
7569 -501.015
rougher.calculation.sulfate_to_au_concentrate \
8109 54063.099
7569 48880.132
rougher.calculation.floatbank10_sulfate_to_au_feed \
8109 5529.013
7569 3614.350
rougher.calculation.floatbank11_sulfate_to_au_feed \
8109 5529.188
7569 3614.239
rougher.calculation.au_pb_ratio rougher.input.feed_ag \
8109 2.185 7.028
7569 2.013 9.786
rougher.input.feed_pb rougher.input.feed_rate rougher.input.feed_size \
8109 2.771 515.477 53.139
7569 4.585 449.716 55.237
rougher.input.feed_sol rougher.input.feed_au \
8109 38.093 6.053
7569 39.826 9.230
rougher.input.floatbank10_sulfate rougher.input.floatbank10_xanthate \
8109 16.999 4.601
7569 15.000 5.393
rougher.input.floatbank11_sulfate rougher.input.floatbank11_xanthate \
8109 17.000 4.600
7569 14.999 5.399
rougher.output.concentrate_ag rougher.output.concentrate_pb \
8109 10.376 8.149
7569 12.675 8.746
rougher.output.concentrate_sol rougher.output.concentrate_au \
8109 29.818 19.670
7569 30.173 21.061
rougher.output.recovery rougher.output.tail_ag rougher.output.tail_pb \
8109 80.437 5.531 0.577
7569 85.760 6.147 0.717
rougher.output.tail_sol rougher.output.tail_au \
8109 18.992 1.574
7569 16.541 2.106
rougher.state.floatbank10_a_air rougher.state.floatbank10_a_level \
8109 1000.927 -299.911
7569 1300.868 -300.027
rougher.state.floatbank10_b_air rougher.state.floatbank10_b_level \
8109 1401.613 -400.062
7569 1299.980 -500.388
rougher.state.floatbank10_c_air rougher.state.floatbank10_c_level \
8109 1400.576 -400.164
7569 1303.291 -500.361
rougher.state.floatbank10_d_air rougher.state.floatbank10_d_level \
8109 1300.766 -401.605
7569 1217.355 -497.089
rougher.state.floatbank10_e_air rougher.state.floatbank10_e_level \
8109 1197.672 -400.654
7569 1003.939 -498.872
rougher.state.floatbank10_f_air rougher.state.floatbank10_f_level \
8109 1098.978 -399.760
7569 1002.843 -499.584
secondary_cleaner.output.tail_ag secondary_cleaner.output.tail_pb \
8109 16.517 7.877
7569 15.433 5.080
secondary_cleaner.output.tail_sol secondary_cleaner.output.tail_au \
8109 3.111 4.614
7569 9.033 4.732
secondary_cleaner.state.floatbank2_a_air \
8109 24.975
7569 35.057
secondary_cleaner.state.floatbank2_a_level \
8109 -500.478
7569 -499.929
secondary_cleaner.state.floatbank2_b_air \
8109 20.091
7569 29.998
secondary_cleaner.state.floatbank2_b_level \
8109 -500.402
7569 -500.004
secondary_cleaner.state.floatbank3_a_air \
8109 25.035
7569 35.942
secondary_cleaner.state.floatbank3_a_level \
8109 -500.531
7569 -499.985
secondary_cleaner.state.floatbank3_b_air \
8109 19.989
7569 33.979
secondary_cleaner.state.floatbank3_b_level \
8109 -500.527
7569 -499.881
secondary_cleaner.state.floatbank4_a_air \
8109 18.023
7569 24.959
secondary_cleaner.state.floatbank4_a_level \
8109 -500.655
7569 -499.281
secondary_cleaner.state.floatbank4_b_air \
8109 13.022
7569 22.944
secondary_cleaner.state.floatbank4_b_level \
8109 -379.244
7569 -508.885
secondary_cleaner.state.floatbank5_a_air \
8109 18.017
7569 26.015
secondary_cleaner.state.floatbank5_a_level \
8109 -499.815
7569 -499.123
secondary_cleaner.state.floatbank5_b_air \
8109 13.011
7569 23.957
secondary_cleaner.state.floatbank5_b_level \
8109 -500.279
7569 -499.566
secondary_cleaner.state.floatbank6_a_air \
8109 14.980
7569 17.999
secondary_cleaner.state.floatbank6_a_level
8109 -500.320
7569 -498.990
--------------------------------------------------------------------------------
Информация по датасету data ' test ':
date primary_cleaner.input.sulfate \
2576 2016-12-30 04:59:59 120.271
2614 2016-12-31 18:59:59 103.435
primary_cleaner.input.depressant primary_cleaner.input.feed_size \
2576 7.987 7.010
2614 9.003 8.033
primary_cleaner.input.xanthate primary_cleaner.state.floatbank8_a_air \
2576 1.185 1667.499
2614 1.218 1667.848
primary_cleaner.state.floatbank8_a_level \
2576 -500.336
2614 -500.637
primary_cleaner.state.floatbank8_b_air \
2576 1695.715
2614 1651.013
primary_cleaner.state.floatbank8_b_level \
2576 -499.730
2614 -500.817
primary_cleaner.state.floatbank8_c_air \
2576 1700.367
2614 1601.649
primary_cleaner.state.floatbank8_c_level \
2576 -502.301
2614 -507.759
primary_cleaner.state.floatbank8_d_air \
2576 1698.357
2614 1599.060
primary_cleaner.state.floatbank8_d_level rougher.input.feed_ag \
2576 -499.623 9.951
2614 -498.257 9.112
rougher.input.feed_pb rougher.input.feed_rate rougher.input.feed_size \
2576 2.874 424.686 43.798
2614 1.625 476.158 53.664
rougher.input.feed_sol rougher.input.feed_au \
2576 34.978 9.239
2614 32.782 6.997
rougher.input.floatbank10_sulfate rougher.input.floatbank10_xanthate \
2576 11.001 6.100
2614 9.820 5.546
rougher.input.floatbank11_sulfate rougher.input.floatbank11_xanthate \
2576 11.000 6.099
2614 9.820 5.544
rougher.state.floatbank10_a_air rougher.state.floatbank10_a_level \
2576 997.551 -499.469
2614 1002.355 -501.353
rougher.state.floatbank10_b_air rougher.state.floatbank10_b_level \
2576 1444.863 -499.291
2614 1500.632 -501.506
rougher.state.floatbank10_c_air rougher.state.floatbank10_c_level \
2576 1446.618 -498.824
2614 1450.440 -502.941
rougher.state.floatbank10_d_air rougher.state.floatbank10_d_level \
2576 1457.711 -501.111
2614 1385.606 -504.164
rougher.state.floatbank10_e_air rougher.state.floatbank10_e_level \
2576 1095.993 -501.188
2614 1050.174 -500.356
rougher.state.floatbank10_f_air rougher.state.floatbank10_f_level \
2576 996.350 -499.394
2614 1001.589 -505.226
secondary_cleaner.state.floatbank2_a_air \
2576 28.987
2614 30.129
secondary_cleaner.state.floatbank2_a_level \
2576 -499.903
2614 -499.958
secondary_cleaner.state.floatbank2_b_air \
2576 27.043
2614 27.990
secondary_cleaner.state.floatbank2_b_level \
2576 -499.942
2614 -500.203
secondary_cleaner.state.floatbank3_a_air \
2576 34.015
2614 35.033
secondary_cleaner.state.floatbank3_a_level \
2576 -500.031
2614 -500.715
secondary_cleaner.state.floatbank3_b_air \
2576 31.016
2614 32.028
secondary_cleaner.state.floatbank3_b_level \
2576 -500.073
2614 -500.082
secondary_cleaner.state.floatbank4_a_air \
2576 17.025
2614 17.021
secondary_cleaner.state.floatbank4_a_level \
2576 -499.993
2614 -501.184
secondary_cleaner.state.floatbank4_b_air \
2576 14.963
2614 14.957
secondary_cleaner.state.floatbank4_b_level \
2576 -500.031
2614 -499.812
secondary_cleaner.state.floatbank5_a_air \
2576 15.015
2614 14.154
secondary_cleaner.state.floatbank5_a_level \
2576 -500.907
2614 -501.076
secondary_cleaner.state.floatbank5_b_air \
2576 12.021
2614 12.018
secondary_cleaner.state.floatbank5_b_level \
2576 -500.207
2614 -500.091
secondary_cleaner.state.floatbank6_a_air \
2576 21.036
2614 20.022
secondary_cleaner.state.floatbank6_a_level
2576 -500.996
2614 -501.340
--------------------------------------------------------------------------------
Видим, что:
Все признаки являются количественными. Категориальных признаков нет.
Названия столбцов соответствуют требованию задания: ([этап].[тип_параметра].[название_параметра]). Например: rougher.input.feed_ag и в коррекции не нуждаются.
Есть информация по содержаниям для трех химических элементов (Au, Ag, Pb). К сожалению, отсутствуют данные по наиболее важному элементу - Cu, который оказывает сильное влияние на флотацию и в концентрате его содержание доходит до 80%, создавая основу для золотосодержащих концентратов.
Значения содержания золота находятся в диапазоне от 1 (в 'хвостах') до 50 в итоговом концентрате. Видимо, эти цифры даны в граммах на тонну (г/т).
Еще одна количественная характеристика, sol (solvent) содержит информацию по концентрации растворителя.
Поиск дубликатов:
for key_df in data:
print("Количество дублирующих строк в датасете data '", key_df, "':", data[key_df].duplicated().sum())
Количество дублирующих строк в датасете data ' full ': 0 Количество дублирующих строк в датасете data ' train ': 0 Количество дублирующих строк в датасете data ' test ': 0
Отлично! Дубликатов в наших таблицах нет.
Выведем основную информацию с помощью метода info():
for key_df in data:
print("\nИнформация по датасету data '", key_df, "':\n")
print(data[key_df].info())
Separating_line()
Информация по датасету data ' full ': <class 'pandas.core.frame.DataFrame'> RangeIndex: 19439 entries, 0 to 19438 Data columns (total 87 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 date 19439 non-null object 1 final.output.concentrate_ag 19438 non-null float64 2 final.output.concentrate_pb 19438 non-null float64 3 final.output.concentrate_sol 19228 non-null float64 4 final.output.concentrate_au 19439 non-null float64 5 final.output.recovery 19439 non-null float64 6 final.output.tail_ag 19438 non-null float64 7 final.output.tail_pb 19338 non-null float64 8 final.output.tail_sol 19433 non-null float64 9 final.output.tail_au 19439 non-null float64 10 primary_cleaner.input.sulfate 19415 non-null float64 11 primary_cleaner.input.depressant 19402 non-null float64 12 primary_cleaner.input.feed_size 19439 non-null float64 13 primary_cleaner.input.xanthate 19335 non-null float64 14 primary_cleaner.output.concentrate_ag 19439 non-null float64 15 primary_cleaner.output.concentrate_pb 19323 non-null float64 16 primary_cleaner.output.concentrate_sol 19069 non-null float64 17 primary_cleaner.output.concentrate_au 19439 non-null float64 18 primary_cleaner.output.tail_ag 19435 non-null float64 19 primary_cleaner.output.tail_pb 19418 non-null float64 20 primary_cleaner.output.tail_sol 19377 non-null float64 21 primary_cleaner.output.tail_au 19439 non-null float64 22 primary_cleaner.state.floatbank8_a_air 19435 non-null float64 23 primary_cleaner.state.floatbank8_a_level 19438 non-null float64 24 primary_cleaner.state.floatbank8_b_air 19435 non-null float64 25 primary_cleaner.state.floatbank8_b_level 19438 non-null float64 26 primary_cleaner.state.floatbank8_c_air 19437 non-null float64 27 primary_cleaner.state.floatbank8_c_level 19438 non-null float64 28 primary_cleaner.state.floatbank8_d_air 19436 non-null float64 29 primary_cleaner.state.floatbank8_d_level 19438 non-null float64 30 rougher.calculation.sulfate_to_au_concentrate 19437 non-null float64 31 rougher.calculation.floatbank10_sulfate_to_au_feed 19437 non-null float64 32 rougher.calculation.floatbank11_sulfate_to_au_feed 19437 non-null float64 33 rougher.calculation.au_pb_ratio 19439 non-null float64 34 rougher.input.feed_ag 19439 non-null float64 35 rougher.input.feed_pb 19339 non-null float64 36 rougher.input.feed_rate 19428 non-null float64 37 rougher.input.feed_size 19294 non-null float64 38 rougher.input.feed_sol 19340 non-null float64 39 rougher.input.feed_au 19439 non-null float64 40 rougher.input.floatbank10_sulfate 19405 non-null float64 41 rougher.input.floatbank10_xanthate 19431 non-null float64 42 rougher.input.floatbank11_sulfate 19395 non-null float64 43 rougher.input.floatbank11_xanthate 18986 non-null float64 44 rougher.output.concentrate_ag 19439 non-null float64 45 rougher.output.concentrate_pb 19439 non-null float64 46 rougher.output.concentrate_sol 19416 non-null float64 47 rougher.output.concentrate_au 19439 non-null float64 48 rougher.output.recovery 19439 non-null float64 49 rougher.output.tail_ag 19438 non-null float64 50 rougher.output.tail_pb 19439 non-null float64 51 rougher.output.tail_sol 19439 non-null float64 52 rougher.output.tail_au 19439 non-null float64 53 rougher.state.floatbank10_a_air 19438 non-null float64 54 rougher.state.floatbank10_a_level 19438 non-null float64 55 rougher.state.floatbank10_b_air 19438 non-null float64 56 rougher.state.floatbank10_b_level 19438 non-null float64 57 rougher.state.floatbank10_c_air 19438 non-null float64 58 rougher.state.floatbank10_c_level 19438 non-null float64 59 rougher.state.floatbank10_d_air 19439 non-null float64 60 rougher.state.floatbank10_d_level 19439 non-null float64 61 rougher.state.floatbank10_e_air 19003 non-null float64 62 rougher.state.floatbank10_e_level 19439 non-null float64 63 rougher.state.floatbank10_f_air 19439 non-null float64 64 rougher.state.floatbank10_f_level 19439 non-null float64 65 secondary_cleaner.output.tail_ag 19437 non-null float64 66 secondary_cleaner.output.tail_pb 19427 non-null float64 67 secondary_cleaner.output.tail_sol 17691 non-null float64 68 secondary_cleaner.output.tail_au 19439 non-null float64 69 secondary_cleaner.state.floatbank2_a_air 19219 non-null float64 70 secondary_cleaner.state.floatbank2_a_level 19438 non-null float64 71 secondary_cleaner.state.floatbank2_b_air 19416 non-null float64 72 secondary_cleaner.state.floatbank2_b_level 19438 non-null float64 73 secondary_cleaner.state.floatbank3_a_air 19426 non-null float64 74 secondary_cleaner.state.floatbank3_a_level 19438 non-null float64 75 secondary_cleaner.state.floatbank3_b_air 19438 non-null float64 76 secondary_cleaner.state.floatbank3_b_level 19438 non-null float64 77 secondary_cleaner.state.floatbank4_a_air 19433 non-null float64 78 secondary_cleaner.state.floatbank4_a_level 19438 non-null float64 79 secondary_cleaner.state.floatbank4_b_air 19438 non-null float64 80 secondary_cleaner.state.floatbank4_b_level 19438 non-null float64 81 secondary_cleaner.state.floatbank5_a_air 19438 non-null float64 82 secondary_cleaner.state.floatbank5_a_level 19438 non-null float64 83 secondary_cleaner.state.floatbank5_b_air 19438 non-null float64 84 secondary_cleaner.state.floatbank5_b_level 19438 non-null float64 85 secondary_cleaner.state.floatbank6_a_air 19437 non-null float64 86 secondary_cleaner.state.floatbank6_a_level 19438 non-null float64 dtypes: float64(86), object(1) memory usage: 12.9+ MB None -------------------------------------------------------------------------------- Информация по датасету data ' train ': <class 'pandas.core.frame.DataFrame'> RangeIndex: 14149 entries, 0 to 14148 Data columns (total 87 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 date 14149 non-null object 1 final.output.concentrate_ag 14148 non-null float64 2 final.output.concentrate_pb 14148 non-null float64 3 final.output.concentrate_sol 13938 non-null float64 4 final.output.concentrate_au 14149 non-null float64 5 final.output.recovery 14149 non-null float64 6 final.output.tail_ag 14149 non-null float64 7 final.output.tail_pb 14049 non-null float64 8 final.output.tail_sol 14144 non-null float64 9 final.output.tail_au 14149 non-null float64 10 primary_cleaner.input.sulfate 14129 non-null float64 11 primary_cleaner.input.depressant 14117 non-null float64 12 primary_cleaner.input.feed_size 14149 non-null float64 13 primary_cleaner.input.xanthate 14049 non-null float64 14 primary_cleaner.output.concentrate_ag 14149 non-null float64 15 primary_cleaner.output.concentrate_pb 14063 non-null float64 16 primary_cleaner.output.concentrate_sol 13863 non-null float64 17 primary_cleaner.output.concentrate_au 14149 non-null float64 18 primary_cleaner.output.tail_ag 14148 non-null float64 19 primary_cleaner.output.tail_pb 14134 non-null float64 20 primary_cleaner.output.tail_sol 14103 non-null float64 21 primary_cleaner.output.tail_au 14149 non-null float64 22 primary_cleaner.state.floatbank8_a_air 14145 non-null float64 23 primary_cleaner.state.floatbank8_a_level 14148 non-null float64 24 primary_cleaner.state.floatbank8_b_air 14145 non-null float64 25 primary_cleaner.state.floatbank8_b_level 14148 non-null float64 26 primary_cleaner.state.floatbank8_c_air 14147 non-null float64 27 primary_cleaner.state.floatbank8_c_level 14148 non-null float64 28 primary_cleaner.state.floatbank8_d_air 14146 non-null float64 29 primary_cleaner.state.floatbank8_d_level 14148 non-null float64 30 rougher.calculation.sulfate_to_au_concentrate 14148 non-null float64 31 rougher.calculation.floatbank10_sulfate_to_au_feed 14148 non-null float64 32 rougher.calculation.floatbank11_sulfate_to_au_feed 14148 non-null float64 33 rougher.calculation.au_pb_ratio 14149 non-null float64 34 rougher.input.feed_ag 14149 non-null float64 35 rougher.input.feed_pb 14049 non-null float64 36 rougher.input.feed_rate 14141 non-null float64 37 rougher.input.feed_size 14005 non-null float64 38 rougher.input.feed_sol 14071 non-null float64 39 rougher.input.feed_au 14149 non-null float64 40 rougher.input.floatbank10_sulfate 14120 non-null float64 41 rougher.input.floatbank10_xanthate 14141 non-null float64 42 rougher.input.floatbank11_sulfate 14113 non-null float64 43 rougher.input.floatbank11_xanthate 13721 non-null float64 44 rougher.output.concentrate_ag 14149 non-null float64 45 rougher.output.concentrate_pb 14149 non-null float64 46 rougher.output.concentrate_sol 14127 non-null float64 47 rougher.output.concentrate_au 14149 non-null float64 48 rougher.output.recovery 14149 non-null float64 49 rougher.output.tail_ag 14148 non-null float64 50 rougher.output.tail_pb 14149 non-null float64 51 rougher.output.tail_sol 14149 non-null float64 52 rougher.output.tail_au 14149 non-null float64 53 rougher.state.floatbank10_a_air 14148 non-null float64 54 rougher.state.floatbank10_a_level 14148 non-null float64 55 rougher.state.floatbank10_b_air 14148 non-null float64 56 rougher.state.floatbank10_b_level 14148 non-null float64 57 rougher.state.floatbank10_c_air 14148 non-null float64 58 rougher.state.floatbank10_c_level 14148 non-null float64 59 rougher.state.floatbank10_d_air 14149 non-null float64 60 rougher.state.floatbank10_d_level 14149 non-null float64 61 rougher.state.floatbank10_e_air 13713 non-null float64 62 rougher.state.floatbank10_e_level 14149 non-null float64 63 rougher.state.floatbank10_f_air 14149 non-null float64 64 rougher.state.floatbank10_f_level 14149 non-null float64 65 secondary_cleaner.output.tail_ag 14147 non-null float64 66 secondary_cleaner.output.tail_pb 14139 non-null float64 67 secondary_cleaner.output.tail_sol 12544 non-null float64 68 secondary_cleaner.output.tail_au 14149 non-null float64 69 secondary_cleaner.state.floatbank2_a_air 13932 non-null float64 70 secondary_cleaner.state.floatbank2_a_level 14148 non-null float64 71 secondary_cleaner.state.floatbank2_b_air 14128 non-null float64 72 secondary_cleaner.state.floatbank2_b_level 14148 non-null float64 73 secondary_cleaner.state.floatbank3_a_air 14145 non-null float64 74 secondary_cleaner.state.floatbank3_a_level 14148 non-null float64 75 secondary_cleaner.state.floatbank3_b_air 14148 non-null float64 76 secondary_cleaner.state.floatbank3_b_level 14148 non-null float64 77 secondary_cleaner.state.floatbank4_a_air 14143 non-null float64 78 secondary_cleaner.state.floatbank4_a_level 14148 non-null float64 79 secondary_cleaner.state.floatbank4_b_air 14148 non-null float64 80 secondary_cleaner.state.floatbank4_b_level 14148 non-null float64 81 secondary_cleaner.state.floatbank5_a_air 14148 non-null float64 82 secondary_cleaner.state.floatbank5_a_level 14148 non-null float64 83 secondary_cleaner.state.floatbank5_b_air 14148 non-null float64 84 secondary_cleaner.state.floatbank5_b_level 14148 non-null float64 85 secondary_cleaner.state.floatbank6_a_air 14147 non-null float64 86 secondary_cleaner.state.floatbank6_a_level 14148 non-null float64 dtypes: float64(86), object(1) memory usage: 9.4+ MB None -------------------------------------------------------------------------------- Информация по датасету data ' test ': <class 'pandas.core.frame.DataFrame'> RangeIndex: 5290 entries, 0 to 5289 Data columns (total 53 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 date 5290 non-null object 1 primary_cleaner.input.sulfate 5286 non-null float64 2 primary_cleaner.input.depressant 5285 non-null float64 3 primary_cleaner.input.feed_size 5290 non-null float64 4 primary_cleaner.input.xanthate 5286 non-null float64 5 primary_cleaner.state.floatbank8_a_air 5290 non-null float64 6 primary_cleaner.state.floatbank8_a_level 5290 non-null float64 7 primary_cleaner.state.floatbank8_b_air 5290 non-null float64 8 primary_cleaner.state.floatbank8_b_level 5290 non-null float64 9 primary_cleaner.state.floatbank8_c_air 5290 non-null float64 10 primary_cleaner.state.floatbank8_c_level 5290 non-null float64 11 primary_cleaner.state.floatbank8_d_air 5290 non-null float64 12 primary_cleaner.state.floatbank8_d_level 5290 non-null float64 13 rougher.input.feed_ag 5290 non-null float64 14 rougher.input.feed_pb 5290 non-null float64 15 rougher.input.feed_rate 5287 non-null float64 16 rougher.input.feed_size 5289 non-null float64 17 rougher.input.feed_sol 5269 non-null float64 18 rougher.input.feed_au 5290 non-null float64 19 rougher.input.floatbank10_sulfate 5285 non-null float64 20 rougher.input.floatbank10_xanthate 5290 non-null float64 21 rougher.input.floatbank11_sulfate 5282 non-null float64 22 rougher.input.floatbank11_xanthate 5265 non-null float64 23 rougher.state.floatbank10_a_air 5290 non-null float64 24 rougher.state.floatbank10_a_level 5290 non-null float64 25 rougher.state.floatbank10_b_air 5290 non-null float64 26 rougher.state.floatbank10_b_level 5290 non-null float64 27 rougher.state.floatbank10_c_air 5290 non-null float64 28 rougher.state.floatbank10_c_level 5290 non-null float64 29 rougher.state.floatbank10_d_air 5290 non-null float64 30 rougher.state.floatbank10_d_level 5290 non-null float64 31 rougher.state.floatbank10_e_air 5290 non-null float64 32 rougher.state.floatbank10_e_level 5290 non-null float64 33 rougher.state.floatbank10_f_air 5290 non-null float64 34 rougher.state.floatbank10_f_level 5290 non-null float64 35 secondary_cleaner.state.floatbank2_a_air 5287 non-null float64 36 secondary_cleaner.state.floatbank2_a_level 5290 non-null float64 37 secondary_cleaner.state.floatbank2_b_air 5288 non-null float64 38 secondary_cleaner.state.floatbank2_b_level 5290 non-null float64 39 secondary_cleaner.state.floatbank3_a_air 5281 non-null float64 40 secondary_cleaner.state.floatbank3_a_level 5290 non-null float64 41 secondary_cleaner.state.floatbank3_b_air 5290 non-null float64 42 secondary_cleaner.state.floatbank3_b_level 5290 non-null float64 43 secondary_cleaner.state.floatbank4_a_air 5290 non-null float64 44 secondary_cleaner.state.floatbank4_a_level 5290 non-null float64 45 secondary_cleaner.state.floatbank4_b_air 5290 non-null float64 46 secondary_cleaner.state.floatbank4_b_level 5290 non-null float64 47 secondary_cleaner.state.floatbank5_a_air 5290 non-null float64 48 secondary_cleaner.state.floatbank5_a_level 5290 non-null float64 49 secondary_cleaner.state.floatbank5_b_air 5290 non-null float64 50 secondary_cleaner.state.floatbank5_b_level 5290 non-null float64 51 secondary_cleaner.state.floatbank6_a_air 5290 non-null float64 52 secondary_cleaner.state.floatbank6_a_level 5290 non-null float64 dtypes: float64(52), object(1) memory usage: 2.1+ MB None --------------------------------------------------------------------------------
Отмечаем:
Эффективность обогащения рассчитывается по формуле:
где:
Вычислим её на обучающей выборке и сравним с признаком rougher.output.recovery.
# Проверим признаки:
# data['train']['rougher.output.concentrate_au']
# data['train']['rougher.input.feed_au']
# data['train']['rougher.output.tail_au']
# data['train']['rougher.output.recovery']
# на отсутствие нулевых значений:
names = ['rougher.output.concentrate_au', 'rougher.input.feed_au',
'rougher.output.tail_au', 'rougher.output.recovery']
print(" Количество нулевых значений в признаках, используемых \
для расчета эффективности обогащения:\n")
for name in names:
print(name, ':', data['train'][name].isna().sum())
Количество нулевых значений в признаках, используемых для расчета эффективности обогащения: rougher.output.concentrate_au : 0 rougher.input.feed_au : 0 rougher.output.tail_au : 0 rougher.output.recovery : 0
# Теперь спокойно рассчитаем значение *Recovery* (эффективность обогащения):
data['train']['recovery'] = \
(data['train']['rougher.output.concentrate_au'] * \
(data['train']['rougher.input.feed_au'] - \
data['train']['rougher.output.tail_au'])) / \
(data['train']['rougher.input.feed_au'] * \
(data['train']['rougher.output.concentrate_au'] - \
data['train']['rougher.output.tail_au'])) * 100
# Найдем MAE между нашими расчётами ('recovery') и
# значением признака ('rougher.output.recovery'):
#print('Recovery:', (data['train']['rougher.output.recovery'] - \
# data['train']['recovery']).sum() / data['train'].shape[0])
# Используем библиотечную функцию:
mae_my = mean_absolute_error(data['train']['rougher.output.recovery'],
data['train']['recovery'])
print('Recovery:', mae_my)
#Удалить созданный признак data['train']['recovery']
data['train'].drop(['recovery'] , axis= 1 , inplace= True )
Recovery: 9.73512347450521e-15
Выводы после проверки правильности расчёта эффективности обогащения:
print("Общее количество пропущенных данных в датасете:\n")
for key_df in data:
print(key_df, data[key_df].isna().sum().sum())
Общее количество пропущенных данных в датасете: full 4481 train 4100 test 90
for key_df in tqdm(data):
print('датасет:', key_df)
skim(data[key_df])
Separating_line()
#for key_df in tqdm(data):
# print(data[key_df].describe())
0%| | 0/3 [00:00<?, ?it/s]
датасет: full
╭──────────────────────────────────────────────── skimpy summary ─────────────────────────────────────────────────╮ │ Data Summary Data Types │ │ ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┏━━━━━━━━━━━━━┳━━━━━━━┓ │ │ ┃ dataframe ┃ Values ┃ ┃ Column Type ┃ Count ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ ┡━━━━━━━━━━━━━╇━━━━━━━┩ │ │ │ Number of rows │ 19439 │ │ float64 │ 86 │ │ │ │ Number of columns │ 87 │ │ string │ 1 │ │ │ └───────────────────┴────────┘ └─────────────┴───────┘ │ │ number │ │ ┏━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━┳━━━━━━━━┓ │ │ ┃ column_name ┃ NA ┃ NA % ┃ mean ┃ sd ┃ p0 ┃ p25 ┃ p75 ┃ p100 ┃ hist ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━╇━━━━━━━━┩ │ │ │ final.output.concent │ 1 │ 0.0051 │ 5.2 │ 1.4 │ 0 │ 4.3 │ 5.9 │ 16 │ █▅ │ │ │ │ final.output.concent │ 1 │ 0.0051 │ 10 │ 1.7 │ 0 │ 9.1 │ 11 │ 17 │ ▁█▂ │ │ │ │ final.output.concent │ 210 │ 1.1 │ 9.5 │ 2.8 │ 0 │ 7.7 │ 11 │ 20 │ ▁█▅▂ │ │ │ │ final.output.concent │ 0 │ 0 │ 44 │ 5.1 │ 0 │ 43 │ 46 │ 53 │ ▃█ │ │ │ │ final.output.recover │ 0 │ 0 │ 67 │ 10 │ 0 │ 63 │ 73 │ 100 │ ▅█ │ │ │ │ final.output.tail_ag │ 1 │ 0.0051 │ 9.7 │ 2.3 │ 0 │ 8.1 │ 11 │ 20 │ ▁██▁ │ │ │ │ final.output.tail_pb │ 100 │ 0.52 │ 2.7 │ 0.95 │ 0 │ 2 │ 3.3 │ 5.8 │ ▁▄█▇▂ │ │ │ │ final.output.tail_so │ 6 │ 0.031 │ 11 │ 2.9 │ 0 │ 8.9 │ 12 │ 22 │ ▁█▆▁ │ │ │ │ final.output.tail_au │ 0 │ 0 │ 3 │ 0.92 │ 0 │ 2.5 │ 3.6 │ 8.2 │ ▆█▁ │ │ │ │ primary_cleaner.inpu │ 24 │ 0.12 │ 140 │ 44 │ 0.0031 │ 110 │ 180 │ 270 │ ▂▇█▄▁ │ │ │ │ primary_cleaner.inpu │ 37 │ 0.19 │ 8.8 │ 3.3 │ 0 │ 6.1 │ 11 │ 40 │ ▄█▁ │ │ │ │ primary_cleaner.inpu │ 0 │ 0 │ 7.3 │ 0.61 │ 1.1 │ 6.9 │ 7.7 │ 16 │ █ │ │ │ │ primary_cleaner.inpu │ 100 │ 0.54 │ 1 │ 0.51 │ 4.6e-06 │ 0.7 │ 1.2 │ 4.1 │ ▃█▂ │ │ │ │ primary_cleaner.outp │ 0 │ 0 │ 8.4 │ 2.1 │ 0 │ 7.3 │ 9.8 │ 16 │ ▁▆█▂ │ │ │ │ primary_cleaner.outp │ 120 │ 0.6 │ 9.8 │ 2.6 │ 0 │ 8.7 │ 11 │ 17 │ ▁▃█▄ │ │ │ │ primary_cleaner.outp │ 370 │ 1.9 │ 10 │ 3.9 │ 0 │ 7.9 │ 13 │ 22 │ ▁▄█▆▃ │ │ │ │ primary_cleaner.outp │ 0 │ 0 │ 32 │ 5.6 │ 0 │ 30 │ 35 │ 46 │ ▃█▁ │ │ │ │ primary_cleaner.outp │ 4 │ 0.021 │ 16 │ 3.5 │ 0 │ 14 │ 18 │ 29 │ ▅█▂ │ │ │ │ primary_cleaner.outp │ 21 │ 0.11 │ 3.4 │ 1.4 │ 0 │ 2.5 │ 4.2 │ 9.6 │ ▁█▇▂▁ │ │ │ │ primary_cleaner.outp │ 62 │ 0.32 │ 8 │ 2.2 │ 0 │ 6.7 │ 9.5 │ 22 │ ▁▄█▁ │ │ │ │ primary_cleaner.outp │ 0 │ 0 │ 3.9 │ 1.6 │ 0 │ 2.9 │ 4.6 │ 18 │ ▃█▁ │ │ │ │ primary_cleaner.stat │ 4 │ 0.021 │ 1600 │ 130 │ 5.4e-32 │ 1500 │ 1700 │ 2100 │ ▁█▁ │ │ │ │ primary_cleaner.stat │ 1 │ 0.0051 │ -490 │ 32 │ -800 │ -500 │ -500 │ -57 │ █▁ │ │ │ │ primary_cleaner.stat │ 4 │ 0.021 │ 1600 │ 130 │ 6.6e-32 │ 1500 │ 1700 │ 2100 │ ▁█ │ │ │ │ primary_cleaner.stat │ 1 │ 0.0051 │ -490 │ 34 │ -800 │ -500 │ -500 │ -140 │ █▁ │ │ │ │ primary_cleaner.stat │ 2 │ 0.01 │ 1600 │ 140 │ 4e-32 │ 1500 │ 1700 │ 2000 │ ▁█▄ │ │ │ │ primary_cleaner.stat │ 1 │ 0.0051 │ -490 │ 33 │ -800 │ -500 │ -500 │ -150 │ █▁ │ │ │ │ primary_cleaner.stat │ 3 │ 0.015 │ 1500 │ 250 │ 4e-32 │ 1500 │ 1700 │ 2400 │ ▁ ▇█ │ │ │ │ primary_cleaner.stat │ 1 │ 0.0051 │ -490 │ 44 │ -800 │ -500 │ -500 │ -31 │ █▁ │ │ │ │ rougher.calculation. │ 2 │ 0.01 │ 42000 │ 320000 │ -42000000 │ 41000 │ 48000 │ 3400000 │ █ │ │ │ │ rougher.calculation. │ 2 │ 0.01 │ 3400 │ 4900 │ -490 │ 2600 │ 3700 │ 630000 │ █ │ │ │ │ rougher.calculation. │ 2 │ 0.01 │ 3300 │ 5800 │ -260 │ 2600 │ 3600 │ 720000 │ █ │ │ │ │ rougher.calculation. │ 0 │ 0 │ 2.4 │ 0.81 │ -0.011 │ 2 │ 2.7 │ 39 │ █ │ │ │ │ rougher.input.feed_a │ 0 │ 0 │ 8.8 │ 1.9 │ 0.01 │ 7.2 │ 10 │ 15 │ ▅█▆▁ │ │ │ │ rougher.input.feed_p │ 100 │ 0.51 │ 3.6 │ 1 │ 0.01 │ 2.9 │ 4.2 │ 7.1 │ ▂█▇▂ │ │ │ │ rougher.input.feed_r │ 11 │ 0.057 │ 480 │ 110 │ 0.003 │ 420 │ 550 │ 720 │ ▁▁▅█▂ │ │ │ │ rougher.input.feed_s │ 140 │ 0.75 │ 59 │ 22 │ 0.046 │ 47 │ 65 │ 480 │ █▁ │ │ │ │ rougher.input.feed_s │ 99 │ 0.51 │ 37 │ 5.1 │ 0.01 │ 34 │ 40 │ 53 │ ▄█ │ │ │ │ rougher.input.feed_a │ 0 │ 0 │ 8.3 │ 2 │ 0.01 │ 6.9 │ 9.8 │ 14 │ ▅█▆▁ │ │ │ │ rougher.input.floatb │ 34 │ 0.17 │ 12 │ 3.4 │ 0.0011 │ 10 │ 15 │ 36 │ █▇ │ │ │ │ rougher.input.floatb │ 8 │ 0.041 │ 6 │ 1.1 │ 0.00057 │ 5.4 │ 6.8 │ 9.7 │ ▂█▅ │ │ │ │ rougher.input.floatb │ 44 │ 0.23 │ 12 │ 3.8 │ 7.7e-05 │ 10 │ 15 │ 38 │ ▁█▆ │ │ │ │ rougher.input.floatb │ 450 │ 2.3 │ 6.1 │ 1.1 │ 0.00029 │ 5.4 │ 6.8 │ 9.7 │ ▂█▆ │ │ │ │ rougher.output.conce │ 0 │ 0 │ 12 │ 2.7 │ 0 │ 11 │ 14 │ 24 │ ██ │ │ │ │ rougher.output.conce │ 0 │ 0 │ 7.6 │ 1.8 │ 0 │ 6.7 │ 8.6 │ 14 │ ▃█▂ │ │ │ │ rougher.output.conce │ 23 │ 0.12 │ 29 │ 5.9 │ 0 │ 27 │ 32 │ 38 │ ▂█▄ │ │ │ │ rougher.output.conce │ 0 │ 0 │ 20 │ 3.8 │ 0 │ 19 │ 22 │ 29 │ ▃█ │ │ │ │ rougher.output.recov │ 0 │ 0 │ 83 │ 14 │ 0 │ 81 │ 90 │ 100 │ ▄█ │ │ │ │ rougher.output.tail_ │ 1 │ 0.0051 │ 5.6 │ 1.1 │ 0.59 │ 4.9 │ 6.4 │ 13 │ ▃█▂ │ │ │ │ rougher.output.tail_ │ 0 │ 0 │ 0.65 │ 0.25 │ 0.0076 │ 0.48 │ 0.78 │ 3.8 │ █▇ │ │ │ │ rougher.output.tail_ │ 0 │ 0 │ 18 │ 3.4 │ 10 │ 16 │ 20 │ 66 │ █▄ │ │ │ │ rougher.output.tail_ │ 0 │ 0 │ 1.8 │ 0.68 │ 0.021 │ 1.4 │ 2.2 │ 9.7 │ ▅█ │ │ │ │ rougher.state.floatb │ 1 │ 0.0051 │ 1100 │ 160 │ -0.042 │ 1000 │ 1200 │ 1500 │ █▂▃ │ │ │ │ rougher.state.floatb │ 1 │ 0.0051 │ -380 │ 94 │ -660 │ -500 │ -300 │ -270 │ ▅ ▁█ │ │ │ │ rougher.state.floatb │ 1 │ 0.0051 │ 1300 │ 180 │ -0.72 │ 1200 │ 1400 │ 1800 │ ▅█▂ │ │ │ │ rougher.state.floatb │ 1 │ 0.0051 │ -470 │ 55 │ -650 │ -500 │ -400 │ -300 │ █ ▂▁ │ │ │ │ rougher.state.floatb │ 1 │ 0.0051 │ 1300 │ 200 │ -0.057 │ 1200 │ 1400 │ 2500 │ ▅█ │ │ │ │ rougher.state.floatb │ 1 │ 0.0051 │ -470 │ 54 │ -650 │ -500 │ -400 │ -290 │ █ ▃▁ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ 1200 │ 200 │ -0.99 │ 1100 │ 1400 │ 1800 │ ▂█▇▁ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -470 │ 54 │ -650 │ -500 │ -400 │ -76 │ █▃▁ │ │ │ │ rougher.state.floatb │ 440 │ 2.2 │ 1100 │ 170 │ -2 │ 1000 │ 1200 │ 1900 │ ▃█▂ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -470 │ 57 │ -650 │ -500 │ -400 │ -140 │ █▃ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ 1000 │ 160 │ -2.6 │ 900 │ 1100 │ 1700 │ ▁█▂ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -470 │ 58 │ -650 │ -500 │ -400 │ -190 │ █ ▃ │ │ │ │ secondary_cleaner.ou │ 2 │ 0.01 │ 15 │ 4.3 │ 0 │ 13 │ 17 │ 23 │ ▁ ▂▅█▁ │ │ │ │ secondary_cleaner.ou │ 12 │ 0.062 │ 5.8 │ 2.8 │ 0 │ 3.9 │ 7.8 │ 17 │ ▂█▅▃ │ │ │ │ secondary_cleaner.ou │ 1700 │ 9 │ 7.2 │ 3.9 │ 0 │ 3.8 │ 10 │ 26 │ ▆▆█▁ │ │ │ │ secondary_cleaner.ou │ 0 │ 0 │ 4.3 │ 2.3 │ 0 │ 3.2 │ 5.1 │ 27 │ █▅ │ │ │ │ secondary_cleaner.st │ 220 │ 1.1 │ 29 │ 5.5 │ 0.078 │ 25 │ 33 │ 53 │ ▄█ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ -500 │ 54 │ -800 │ -500 │ -500 │ -130 │ █ │ │ │ │ secondary_cleaner.st │ 23 │ 0.12 │ 24 │ 5.7 │ 0 │ 21 │ 28 │ 35 │ ▂▅█▃ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ -500 │ 57 │ -800 │ -500 │ -500 │ -210 │ █ │ │ │ │ secondary_cleaner.st │ 13 │ 0.067 │ 28 │ 6.1 │ 0 │ 25 │ 33 │ 44 │ ▂█▆▂ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ -490 │ 54 │ -800 │ -500 │ -500 │ -190 │ █▂ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ 22 │ 5.6 │ 0 │ 19 │ 26 │ 35 │ ▂█▆▁ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ -490 │ 43 │ -810 │ -500 │ -500 │ -160 │ █▁ │ │ │ │ secondary_cleaner.st │ 6 │ 0.031 │ 19 │ 5.4 │ 0 │ 15 │ 23 │ 30 │ ▁▅█▅▂ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ -490 │ 48 │ -800 │ -500 │ -500 │ -250 │ █▂ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ 15 │ 4.9 │ 0 │ 12 │ 19 │ 31 │ ▁▃█▄▃ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ -460 │ 67 │ -800 │ -500 │ -400 │ -6.5 │ █▄ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ 16 │ 5.5 │ -0.37 │ 11 │ 18 │ 44 │ █▆▃ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ -490 │ 35 │ -800 │ -500 │ -500 │ -240 │ █▁ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ 12 │ 5.3 │ 0.53 │ 9 │ 14 │ 28 │ ▂▅█▁▂▁ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ -490 │ 38 │ -800 │ -500 │ -500 │ -140 │ █▂ │ │ │ │ secondary_cleaner.st │ 2 │ 0.01 │ 19 │ 5.6 │ -0.079 │ 15 │ 24 │ 32 │ ▁█▅▆▁ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0051 │ -510 │ 38 │ -810 │ -500 │ -500 │ -100 │ ▁█ │ │ │ └────────────────────────┴───────┴─────────┴────────┴─────────┴───────────┴───────┴───────┴─────────┴────────┘ │ │ string │ │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │ ┃ column_name ┃ NA ┃ NA % ┃ words per row ┃ total words ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │ │ date │ 0 │ 0 │ 2 │ 39000 │ │ │ └───────────────────────────┴─────────┴────────────┴──────────────────────────────┴──────────────────────────┘ │ ╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯
-------------------------------------------------------------------------------- датасет: train
╭──────────────────────────────────────────────── skimpy summary ─────────────────────────────────────────────────╮ │ Data Summary Data Types │ │ ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┏━━━━━━━━━━━━━┳━━━━━━━┓ │ │ ┃ dataframe ┃ Values ┃ ┃ Column Type ┃ Count ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ ┡━━━━━━━━━━━━━╇━━━━━━━┩ │ │ │ Number of rows │ 14149 │ │ float64 │ 86 │ │ │ │ Number of columns │ 87 │ │ string │ 1 │ │ │ └───────────────────┴────────┘ └─────────────┴───────┘ │ │ number │ │ ┏━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━┳━━━━━━━━┓ │ │ ┃ column_name ┃ NA ┃ NA % ┃ mean ┃ sd ┃ p0 ┃ p25 ┃ p75 ┃ p100 ┃ hist ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━╇━━━━━━━━┩ │ │ │ final.output.concent │ 1 │ 0.0071 │ 5.1 │ 1.4 │ 0 │ 4.2 │ 5.9 │ 16 │ █▅ │ │ │ │ final.output.concent │ 1 │ 0.0071 │ 10 │ 1.7 │ 0 │ 9.3 │ 11 │ 17 │ ▁█▂ │ │ │ │ final.output.concent │ 210 │ 1.5 │ 9.2 │ 2.8 │ 0 │ 7.5 │ 10 │ 18 │ ▁█▅▂▁ │ │ │ │ final.output.concent │ 0 │ 0 │ 44 │ 4.9 │ 0 │ 43 │ 46 │ 53 │ ▄█ │ │ │ │ final.output.recover │ 0 │ 0 │ 67 │ 10 │ 0 │ 63 │ 72 │ 100 │ ▁▆█ │ │ │ │ final.output.tail_ag │ 0 │ 0 │ 9.6 │ 2.3 │ 0 │ 8 │ 11 │ 20 │ ▁█▆▁ │ │ │ │ final.output.tail_pb │ 100 │ 0.71 │ 2.6 │ 0.97 │ 0 │ 1.9 │ 3.2 │ 5.6 │ ▁▅█▆▂ │ │ │ │ final.output.tail_so │ 5 │ 0.035 │ 11 │ 3 │ 0 │ 8.8 │ 12 │ 22 │ ▁█▅▁ │ │ │ │ final.output.tail_au │ 0 │ 0 │ 2.9 │ 0.9 │ 0 │ 2.4 │ 3.4 │ 8.2 │ ▇█▁ │ │ │ │ primary_cleaner.inpu │ 20 │ 0.14 │ 130 │ 39 │ 0.0031 │ 110 │ 160 │ 250 │ ▂▇█▄▁ │ │ │ │ primary_cleaner.inpu │ 32 │ 0.23 │ 8.9 │ 3.4 │ 0 │ 6 │ 12 │ 20 │ ▁▆█▅▂ │ │ │ │ primary_cleaner.inpu │ 0 │ 0 │ 7.3 │ 0.61 │ 1.1 │ 7 │ 7.7 │ 10 │ █▇ │ │ │ │ primary_cleaner.inpu │ 100 │ 0.71 │ 0.89 │ 0.37 │ 4.6e-06 │ 0.61 │ 1.1 │ 2.5 │ ▂██▃▁ │ │ │ │ primary_cleaner.outp │ 0 │ 0 │ 8.2 │ 2 │ 0 │ 7.1 │ 9.5 │ 16 │ ▁▇█▁ │ │ │ │ primary_cleaner.outp │ 86 │ 0.61 │ 9.6 │ 2.7 │ 0 │ 8.3 │ 11 │ 17 │ ▁▃█▃ │ │ │ │ primary_cleaner.outp │ 290 │ 2 │ 10 │ 4.1 │ 0 │ 7.5 │ 13 │ 22 │ ▁▄█▅▃ │ │ │ │ primary_cleaner.outp │ 0 │ 0 │ 32 │ 5.8 │ 0 │ 31 │ 35 │ 46 │ ▂█▁ │ │ │ │ primary_cleaner.outp │ 1 │ 0.0071 │ 16 │ 3.7 │ 0 │ 14 │ 18 │ 29 │ ▆█▃ │ │ │ │ primary_cleaner.outp │ 15 │ 0.11 │ 3.4 │ 1.5 │ 0 │ 2.4 │ 4.3 │ 9.6 │ ▁█▆▂▁ │ │ │ │ primary_cleaner.outp │ 46 │ 0.33 │ 7.5 │ 2.1 │ 0 │ 6.3 │ 8.9 │ 21 │ ▁▄█▁ │ │ │ │ primary_cleaner.outp │ 0 │ 0 │ 3.8 │ 1.6 │ 0 │ 2.9 │ 4.5 │ 18 │ ▄█▁ │ │ │ │ primary_cleaner.stat │ 4 │ 0.028 │ 1600 │ 130 │ 0.0064 │ 1600 │ 1700 │ 2100 │ █▁ │ │ │ │ primary_cleaner.stat │ 1 │ 0.0071 │ -490 │ 36 │ -800 │ -500 │ -500 │ -330 │ █ ▁ │ │ │ │ primary_cleaner.stat │ 4 │ 0.028 │ 1600 │ 130 │ 0.0087 │ 1600 │ 1700 │ 2100 │ ▁█ │ │ │ │ primary_cleaner.stat │ 1 │ 0.0071 │ -490 │ 34 │ -740 │ -500 │ -500 │ -350 │ █ ▁ │ │ │ │ primary_cleaner.stat │ 2 │ 0.014 │ 1600 │ 130 │ 0.015 │ 1500 │ 1700 │ 2000 │ █▆ │ │ │ │ primary_cleaner.stat │ 1 │ 0.0071 │ -490 │ 36 │ -800 │ -500 │ -500 │ -350 │ █▁▁ │ │ │ │ primary_cleaner.stat │ 3 │ 0.021 │ 1500 │ 280 │ 0.0087 │ 1500 │ 1700 │ 2400 │ ▁ ▆█ │ │ │ │ primary_cleaner.stat │ 1 │ 0.0071 │ -480 │ 47 │ -800 │ -500 │ -500 │ -31 │ █▁ │ │ │ │ rougher.calculation. │ 1 │ 0.0071 │ 40000 │ 380000 │ -42000000 │ 40000 │ 48000 │ 3400000 │ █ │ │ │ │ rougher.calculation. │ 1 │ 0.0071 │ 3500 │ 5800 │ -490 │ 2500 │ 3700 │ 630000 │ █ │ │ │ │ rougher.calculation. │ 1 │ 0.0071 │ 3300 │ 6800 │ -260 │ 2500 │ 3600 │ 720000 │ █ │ │ │ │ rougher.calculation. │ 0 │ 0 │ 2.4 │ 0.87 │ -0.011 │ 2 │ 2.7 │ 39 │ █ │ │ │ │ rougher.input.feed_a │ 0 │ 0 │ 8.6 │ 1.9 │ 0.01 │ 7.1 │ 9.9 │ 15 │ ▆█▄▁ │ │ │ │ rougher.input.feed_p │ 100 │ 0.71 │ 3.5 │ 1.1 │ 0.01 │ 2.8 │ 4.2 │ 7.1 │ ▂█▆▂ │ │ │ │ rougher.input.feed_r │ 8 │ 0.057 │ 470 │ 100 │ 0.013 │ 420 │ 550 │ 720 │ ▁▁▄█▁ │ │ │ │ rougher.input.feed_s │ 140 │ 1 │ 60 │ 22 │ 9.7 │ 49 │ 66 │ 480 │ █ │ │ │ │ rougher.input.feed_s │ 78 │ 0.55 │ 36 │ 5 │ 0.01 │ 34 │ 39 │ 48 │ ▂█▂ │ │ │ │ rougher.input.feed_a │ 0 │ 0 │ 7.9 │ 1.9 │ 0.01 │ 6.6 │ 9.1 │ 13 │ ▄█▄▁ │ │ │ │ rougher.input.floatb │ 29 │ 0.2 │ 12 │ 3.3 │ 0.0011 │ 9.9 │ 14 │ 36 │ █▅ │ │ │ │ rougher.input.floatb │ 8 │ 0.057 │ 5.9 │ 1.1 │ 0.0014 │ 5.1 │ 6.6 │ 9.7 │ ▃█▅ │ │ │ │ rougher.input.floatb │ 36 │ 0.25 │ 11 │ 3.7 │ 9.8e-05 │ 9.5 │ 13 │ 38 │ ▁█▄ │ │ │ │ rougher.input.floatb │ 430 │ 3 │ 5.9 │ 1.1 │ 0.00029 │ 5.2 │ 6.7 │ 9.7 │ ▂█▅ │ │ │ │ rougher.output.conce │ 0 │ 0 │ 12 │ 2.7 │ 0 │ 10 │ 13 │ 24 │ █▆ │ │ │ │ rougher.output.conce │ 0 │ 0 │ 7.7 │ 1.9 │ 0 │ 6.9 │ 8.6 │ 14 │ ▃█▂ │ │ │ │ rougher.output.conce │ 22 │ 0.16 │ 28 │ 6.1 │ 0 │ 27 │ 32 │ 38 │ ▂█▃ │ │ │ │ rougher.output.conce │ 0 │ 0 │ 19 │ 3.8 │ 0 │ 18 │ 21 │ 28 │ ▃█▁ │ │ │ │ rougher.output.recov │ 0 │ 0 │ 83 │ 14 │ 0 │ 80 │ 90 │ 100 │ ▅█ │ │ │ │ rougher.output.tail_ │ 1 │ 0.0071 │ 5.6 │ 1 │ 0.59 │ 4.9 │ 6.3 │ 13 │ ▂█▁ │ │ │ │ rougher.output.tail_ │ 0 │ 0 │ 0.65 │ 0.26 │ 0.0076 │ 0.47 │ 0.79 │ 3.8 │ █▇ │ │ │ │ rougher.output.tail_ │ 0 │ 0 │ 18 │ 3.4 │ 10 │ 16 │ 20 │ 66 │ █▄ │ │ │ │ rougher.output.tail_ │ 0 │ 0 │ 1.8 │ 0.71 │ 0.021 │ 1.3 │ 2.2 │ 9.7 │ ▆█ │ │ │ │ rougher.state.floatb │ 1 │ 0.0071 │ 1100 │ 170 │ -0.041 │ 1000 │ 1300 │ 1500 │ █▂▄ │ │ │ │ rougher.state.floatb │ 1 │ 0.0071 │ -370 │ 94 │ -650 │ -500 │ -300 │ -280 │ ▄ ▁█ │ │ │ │ rougher.state.floatb │ 1 │ 0.0071 │ 1300 │ 180 │ -0.65 │ 1200 │ 1400 │ 1800 │ ▆█▂ │ │ │ │ rougher.state.floatb │ 1 │ 0.0071 │ -460 │ 57 │ -650 │ -500 │ -400 │ -300 │ █ ▃▁ │ │ │ │ rougher.state.floatb │ 1 │ 0.0071 │ 1300 │ 210 │ -0.035 │ 1100 │ 1500 │ 2500 │ ▆█ │ │ │ │ rougher.state.floatb │ 1 │ 0.0071 │ -470 │ 56 │ -640 │ -500 │ -400 │ -290 │ █ ▃▁ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ 1200 │ 210 │ -0.55 │ 1100 │ 1300 │ 1800 │ ▂█▆▁ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -470 │ 56 │ -640 │ -500 │ -400 │ -210 │ █ ▃▁ │ │ │ │ rougher.state.floatb │ 440 │ 3.1 │ 1100 │ 180 │ -2 │ 1000 │ 1200 │ 1900 │ ▃█▂ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -460 │ 57 │ -650 │ -500 │ -400 │ -270 │ █▃▁ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ 1000 │ 180 │ -2.4 │ 900 │ 1100 │ 1700 │ ▂█▂ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -460 │ 57 │ -650 │ -500 │ -400 │ -190 │ █ ▃ │ │ │ │ secondary_cleaner.ou │ 2 │ 0.014 │ 14 │ 4.5 │ 0 │ 12 │ 17 │ 23 │ ▁ ▂▆█▁ │ │ │ │ secondary_cleaner.ou │ 10 │ 0.071 │ 5.8 │ 2.9 │ 0 │ 4 │ 7.8 │ 17 │ ▂█▆▃▁ │ │ │ │ secondary_cleaner.ou │ 1600 │ 11 │ 6.9 │ 4.2 │ 0 │ 3.2 │ 11 │ 18 │ ▆▅▅█▃ │ │ │ │ secondary_cleaner.ou │ 0 │ 0 │ 4.2 │ 2.4 │ 0 │ 3.2 │ 4.9 │ 27 │ █▄ │ │ │ │ secondary_cleaner.st │ 220 │ 1.5 │ 30 │ 5.8 │ 0.078 │ 25 │ 35 │ 53 │ ▃█ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ -500 │ 60 │ -800 │ -500 │ -500 │ -130 │ █▁ │ │ │ │ secondary_cleaner.st │ 21 │ 0.15 │ 25 │ 6 │ 0 │ 22 │ 29 │ 35 │ ▂▃█▄ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ -500 │ 63 │ -800 │ -500 │ -500 │ -210 │ █▁ │ │ │ │ secondary_cleaner.st │ 4 │ 0.028 │ 29 │ 5.6 │ 0 │ 25 │ 35 │ 44 │ ▂█▆▂ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ -480 │ 55 │ -800 │ -500 │ -440 │ -190 │ █▃ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ 23 │ 5 │ 0 │ 20 │ 26 │ 35 │ ▂█▆▁ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ -490 │ 42 │ -760 │ -500 │ -500 │ -160 │ █▁ │ │ │ │ secondary_cleaner.st │ 6 │ 0.042 │ 20 │ 5.7 │ 0 │ 15 │ 25 │ 30 │ ▁▆▇█▃ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ -480 │ 51 │ -800 │ -500 │ -480 │ -250 │ █▃ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ 15 │ 5.3 │ 0 │ 12 │ 20 │ 24 │ ▂▅█▂▇ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ -460 │ 59 │ -800 │ -500 │ -400 │ -150 │ █▆ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ 17 │ 5.8 │ -0.37 │ 11 │ 21 │ 44 │ ██▅ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ -480 │ 38 │ -800 │ -500 │ -490 │ -280 │ █▁ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ 13 │ 5.8 │ 0.65 │ 9 │ 18 │ 28 │ ▂▄█▂▄▁ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ -480 │ 39 │ -800 │ -500 │ -450 │ -160 │ █▃ │ │ │ │ secondary_cleaner.st │ 2 │ 0.014 │ 20 │ 5.8 │ 0.2 │ 15 │ 25 │ 32 │ █▅▆▂ │ │ │ │ secondary_cleaner.st │ 1 │ 0.0071 │ -510 │ 37 │ -810 │ -500 │ -500 │ -100 │ ▁█ │ │ │ └────────────────────────┴───────┴─────────┴────────┴─────────┴───────────┴───────┴───────┴─────────┴────────┘ │ │ string │ │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │ ┃ column_name ┃ NA ┃ NA % ┃ words per row ┃ total words ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │ │ date │ 0 │ 0 │ 2 │ 28000 │ │ │ └───────────────────────────┴─────────┴────────────┴──────────────────────────────┴──────────────────────────┘ │ ╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯
-------------------------------------------------------------------------------- датасет: test
╭──────────────────────────────────────────────── skimpy summary ─────────────────────────────────────────────────╮ │ Data Summary Data Types │ │ ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┏━━━━━━━━━━━━━┳━━━━━━━┓ │ │ ┃ dataframe ┃ Values ┃ ┃ Column Type ┃ Count ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ ┡━━━━━━━━━━━━━╇━━━━━━━┩ │ │ │ Number of rows │ 5290 │ │ float64 │ 52 │ │ │ │ Number of columns │ 53 │ │ string │ 1 │ │ │ └───────────────────┴────────┘ └─────────────┴───────┘ │ │ number │ │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━┓ │ │ ┃ column_name ┃ NA ┃ NA % ┃ mean ┃ sd ┃ p0 ┃ p25 ┃ p75 ┃ p100 ┃ hist ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━┩ │ │ │ primary_cleaner.inpu │ 4 │ 0.076 │ 170 │ 43 │ 2.6 │ 150 │ 210 │ 270 │ ▁▃▇█▃ │ │ │ │ primary_cleaner.inpu │ 5 │ 0.095 │ 8.7 │ 3.1 │ 0.0038 │ 6.5 │ 10 │ 40 │ ▄█▁ │ │ │ │ primary_cleaner.inpu │ 0 │ 0 │ 7.3 │ 0.61 │ 5.7 │ 6.9 │ 7.6 │ 16 │ █▇ │ │ │ │ primary_cleaner.inpu │ 4 │ 0.076 │ 1.4 │ 0.64 │ 0.005 │ 0.91 │ 1.8 │ 4.1 │ ▁█▄▂ │ │ │ │ primary_cleaner.stat │ 0 │ 0 │ 1500 │ 120 │ 5.4e-32 │ 1500 │ 1600 │ 2100 │ ▂█ │ │ │ │ primary_cleaner.stat │ 0 │ 0 │ -500 │ 20 │ -800 │ -500 │ -500 │ -57 │ █ │ │ │ │ primary_cleaner.stat │ 0 │ 0 │ 1500 │ 120 │ 6.6e-32 │ 1500 │ 1600 │ 1800 │ ▅█ │ │ │ │ primary_cleaner.stat │ 0 │ 0 │ -500 │ 33 │ -800 │ -500 │ -500 │ -140 │ █ │ │ │ │ primary_cleaner.stat │ 0 │ 0 │ 1500 │ 120 │ 4e-32 │ 1500 │ 1600 │ 1700 │ ▂█ │ │ │ │ primary_cleaner.stat │ 0 │ 0 │ -500 │ 22 │ -800 │ -500 │ -500 │ -150 │ █ │ │ │ │ primary_cleaner.stat │ 0 │ 0 │ 1500 │ 120 │ 4e-32 │ 1500 │ 1600 │ 1900 │ ██ │ │ │ │ primary_cleaner.stat │ 0 │ 0 │ -500 │ 31 │ -800 │ -500 │ -500 │ -160 │ █ │ │ │ │ rougher.input.feed_a │ 0 │ 0 │ 9.4 │ 1.9 │ 0.57 │ 8.1 │ 11 │ 14 │ ▃▆█▁ │ │ │ │ rougher.input.feed_p │ 0 │ 0 │ 3.8 │ 0.95 │ 0.27 │ 3.2 │ 4.3 │ 6.9 │ ▁▆█▃ │ │ │ │ rougher.input.feed_r │ 3 │ 0.057 │ 490 │ 110 │ 0.003 │ 410 │ 580 │ 710 │ ▁▇█▅ │ │ │ │ rougher.input.feed_s │ 1 │ 0.019 │ 56 │ 19 │ 0.046 │ 44 │ 62 │ 390 │ █▂ │ │ │ │ rougher.input.feed_s │ 21 │ 0.4 │ 38 │ 5.5 │ 1.4 │ 35 │ 42 │ 53 │ ▅█▁ │ │ │ │ rougher.input.feed_a │ 0 │ 0 │ 9.3 │ 1.6 │ 0.57 │ 8.2 │ 10 │ 14 │ ▂▅█▁ │ │ │ │ rougher.input.floatb │ 5 │ 0.095 │ 14 │ 3.4 │ 0.0011 │ 12 │ 17 │ 24 │ ▁▆█▅ │ │ │ │ rougher.input.floatb │ 0 │ 0 │ 6.5 │ 1.1 │ 0.00057 │ 6 │ 7.1 │ 8.9 │ ▃█▂ │ │ │ │ rougher.input.floatb │ 8 │ 0.15 │ 14 │ 3.2 │ 7.7e-05 │ 12 │ 17 │ 24 │ ▁▅█▅ │ │ │ │ rougher.input.floatb │ 25 │ 0.47 │ 6.5 │ 0.89 │ 0.007 │ 6 │ 7.1 │ 8.6 │ ▂█▃ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ 1100 │ 120 │ -0.042 │ 1000 │ 1000 │ 1400 │ █▂ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -400 │ 91 │ -660 │ -500 │ -300 │ -270 │ █ ▄█ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ 1300 │ 160 │ -0.72 │ 1200 │ 1400 │ 1700 │ ▂█▃ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -480 │ 46 │ -650 │ -500 │ -450 │ -300 │ █ ▂ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ 1300 │ 170 │ -0.057 │ 1200 │ 1400 │ 1700 │ ▃█▄ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -470 │ 46 │ -650 │ -500 │ -450 │ -300 │ █ ▂ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ 1200 │ 190 │ -0.99 │ 1100 │ 1400 │ 1800 │ ▁▃█▁ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -480 │ 48 │ -650 │ -500 │ -450 │ -76 │ █▃ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ 1100 │ 130 │ -2 │ 1000 │ 1100 │ 1500 │ ▂█▁ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -470 │ 59 │ -650 │ -500 │ -450 │ -140 │ █▂ ▁ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ 1000 │ 130 │ -2.6 │ 900 │ 1100 │ 1500 │ ▆█▁ │ │ │ │ rougher.state.floatb │ 0 │ 0 │ -470 │ 61 │ -650 │ -500 │ -450 │ -250 │ █▂ ▁ │ │ │ │ secondary_cleaner.st │ 3 │ 0.057 │ 26 │ 3.4 │ 0.21 │ 25 │ 28 │ 32 │ ▇█ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ -500 │ 29 │ -780 │ -500 │ -500 │ -300 │ █ │ │ │ │ secondary_cleaner.st │ 2 │ 0.038 │ 22 │ 4.4 │ 0.0061 │ 20 │ 25 │ 28 │ ▁▁█▆ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ -500 │ 35 │ -800 │ -500 │ -500 │ -210 │ █ │ │ │ │ secondary_cleaner.st │ 9 │ 0.17 │ 25 │ 6.5 │ 0 │ 23 │ 30 │ 40 │ ▁█▇▁ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ -510 │ 48 │ -800 │ -500 │ -500 │ -310 │ █ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ 21 │ 6.7 │ 1.5e-17 │ 18 │ 27 │ 32 │ ▁▁▄█▆█ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ -510 │ 45 │ -810 │ -500 │ -500 │ -200 │ █ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ 16 │ 3.5 │ 1.1e-16 │ 14 │ 18 │ 30 │ ▁▃█▁ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ -510 │ 31 │ -800 │ -500 │ -500 │ -400 │ █ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ 14 │ 3.4 │ 2.5e-17 │ 12 │ 16 │ 31 │ ▁▃█▅ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ -460 │ 86 │ -800 │ -500 │ -400 │ -6.5 │ █▃ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ 13 │ 3 │ 0.069 │ 11 │ 15 │ 25 │ ▂██▃ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ -500 │ 18 │ -800 │ -500 │ -500 │ -240 │ █ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ 9.9 │ 2.9 │ 0.53 │ 8 │ 12 │ 14 │ ▂▂▆▅█ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ -500 │ 35 │ -800 │ -500 │ -500 │ -140 │ █ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ 17 │ 4.5 │ -0.079 │ 14 │ 21 │ 27 │ ▅▇█▂ │ │ │ │ secondary_cleaner.st │ 0 │ 0 │ -500 │ 39 │ -810 │ -500 │ -500 │ -120 │ █ │ │ │ └────────────────────────────┴─────┴─────────┴────────┴────────┴───────────┴───────┴───────┴───────┴─────────┘ │ │ string │ │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │ ┃ column_name ┃ NA ┃ NA % ┃ words per row ┃ total words ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │ │ date │ 0 │ 0 │ 2 │ 11000 │ │ │ └───────────────────────────┴─────────┴────────────┴──────────────────────────────┴──────────────────────────┘ │ ╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯
--------------------------------------------------------------------------------
Отмечаем:
Есть два исключения:
В датасете data['test'] в признаке 'rougher.input.floatbank11_xanthate'. Всего 25, что составляет 0.47% от общего их количества.
Присутствуют отрицательные значения в признаках типа 'primary_cleaner.state.floatbank8_a_level'. Присутствуют a, b, c, d уровни. Отрицательные значения, видимо, говорят об уровне ниже 'полного' значения на измереную и указанную в датасет величину.
Значения 'rougher.calculation.sulfate_to_au_concentrate' имеет широкий диапазон: от отрицательных значений - 4.2e7 до 3.4e4. В дальнейшем придется выполнять масштабирование.
Довольно много встречается значений, равных '0'. Это подозрительно. Чаще всего '0' свидетельствует об отсутствии аналитического сигнала.
Распределение аналитических значений в признаках в основном близко к нормальному. есть смещения в одну или другую сторону.
# переведём столбец с датой в тип datetime "дата"
data['train']['date'] = pd.to_datetime(data['train']['date'], errors='coerce')
data['train']['hour'] = pd.DatetimeIndex(data['train']['date']).hour
data['train']['day_month'] = pd.DatetimeIndex(data['train']['date']).day
data['train']['month'] = pd.DatetimeIndex(data['train']['date']).month
data['train']['year'] = pd.DatetimeIndex(data['train']['date']).year
#days_in_week={
# 0: 'Monday',
# 1: 'Tuesday',
# 2: 'Wednesday',
# 3: 'Thursday',
# 4: 'Friday',
# 5: 'Saturday',
# 6: 'Sunday'
#}
days_in_week={0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6}
data['train']['day_week']=pd.DatetimeIndex(data['train']['date']).weekday.map(days_in_week)
# Проверим, что получилось:
data['train'].sample(2)
| date | final.output.concentrate_ag | final.output.concentrate_pb | final.output.concentrate_sol | final.output.concentrate_au | final.output.recovery | final.output.tail_ag | final.output.tail_pb | final.output.tail_sol | final.output.tail_au | primary_cleaner.input.sulfate | primary_cleaner.input.depressant | primary_cleaner.input.feed_size | primary_cleaner.input.xanthate | primary_cleaner.output.concentrate_ag | primary_cleaner.output.concentrate_pb | primary_cleaner.output.concentrate_sol | primary_cleaner.output.concentrate_au | primary_cleaner.output.tail_ag | primary_cleaner.output.tail_pb | primary_cleaner.output.tail_sol | primary_cleaner.output.tail_au | primary_cleaner.state.floatbank8_a_air | primary_cleaner.state.floatbank8_a_level | primary_cleaner.state.floatbank8_b_air | primary_cleaner.state.floatbank8_b_level | primary_cleaner.state.floatbank8_c_air | primary_cleaner.state.floatbank8_c_level | primary_cleaner.state.floatbank8_d_air | primary_cleaner.state.floatbank8_d_level | rougher.calculation.sulfate_to_au_concentrate | rougher.calculation.floatbank10_sulfate_to_au_feed | rougher.calculation.floatbank11_sulfate_to_au_feed | rougher.calculation.au_pb_ratio | rougher.input.feed_ag | rougher.input.feed_pb | rougher.input.feed_rate | rougher.input.feed_size | rougher.input.feed_sol | rougher.input.feed_au | rougher.input.floatbank10_sulfate | rougher.input.floatbank10_xanthate | rougher.input.floatbank11_sulfate | rougher.input.floatbank11_xanthate | rougher.output.concentrate_ag | rougher.output.concentrate_pb | rougher.output.concentrate_sol | rougher.output.concentrate_au | rougher.output.recovery | rougher.output.tail_ag | rougher.output.tail_pb | rougher.output.tail_sol | rougher.output.tail_au | rougher.state.floatbank10_a_air | rougher.state.floatbank10_a_level | rougher.state.floatbank10_b_air | rougher.state.floatbank10_b_level | rougher.state.floatbank10_c_air | rougher.state.floatbank10_c_level | rougher.state.floatbank10_d_air | rougher.state.floatbank10_d_level | rougher.state.floatbank10_e_air | rougher.state.floatbank10_e_level | rougher.state.floatbank10_f_air | rougher.state.floatbank10_f_level | secondary_cleaner.output.tail_ag | secondary_cleaner.output.tail_pb | secondary_cleaner.output.tail_sol | secondary_cleaner.output.tail_au | secondary_cleaner.state.floatbank2_a_air | secondary_cleaner.state.floatbank2_a_level | secondary_cleaner.state.floatbank2_b_air | secondary_cleaner.state.floatbank2_b_level | secondary_cleaner.state.floatbank3_a_air | secondary_cleaner.state.floatbank3_a_level | secondary_cleaner.state.floatbank3_b_air | secondary_cleaner.state.floatbank3_b_level | secondary_cleaner.state.floatbank4_a_air | secondary_cleaner.state.floatbank4_a_level | secondary_cleaner.state.floatbank4_b_air | secondary_cleaner.state.floatbank4_b_level | secondary_cleaner.state.floatbank5_a_air | secondary_cleaner.state.floatbank5_a_level | secondary_cleaner.state.floatbank5_b_air | secondary_cleaner.state.floatbank5_b_level | secondary_cleaner.state.floatbank6_a_air | secondary_cleaner.state.floatbank6_a_level | hour | day_month | month | year | day_week | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 878 | 2016-02-24 00:00:00 | 5.828 | 12.580 | 10.918 | 40.000 | 74.317 | 12.936 | 2.356 | 10.449 | 3.100 | 152.474 | 8.957 | 8.170 | 0.710 | 10.292 | 9.509 | 15.483 | 31.388 | 16.637 | 3.503 | 7.808 | 3.429 | 1696.221 | -399.846 | 1701.258 | -400.279 | 1699.413 | -399.652 | 1265.777 | -400.946 | 46843.400 | 3094.579 | 3101.765 | 2.037 | 12.043 | 4.840 | 349.198 | 41.465 | 29.983 | 9.860 | 11.031 | 5.497 | 11.042 | 5.500 | 12.393 | 9.078 | 28.777 | 20.305 | 91.336 | 5.490 | 0.324 | 12.477 | 1.535 | 1099.957 | -499.989 | 1651.081 | -499.928 | 1650.251 | -499.777 | 1652.742 | -499.561 | 1600.817 | -499.430 | 1599.995 | -500.294 | 15.138 | 5.189 | 10.631 | 3.856 | 31.121 | -399.651 | 29.051 | -399.134 | 31.038 | -382.258 | 28.968 | -400.847 | 16.005 | -499.755 | 14.110 | -499.585 | 12.086 | -500.563 | 10.000 | -500.066 | 20.012 | -499.637 | 0 | 24 | 2 | 2016 | 2 |
| 4199 | 2016-08-11 03:59:59 | 6.815 | 8.754 | 9.577 | 42.697 | 73.179 | 10.834 | 2.771 | 10.675 | 3.156 | 139.148 | 9.512 | 7.070 | 0.463 | 10.938 | 10.243 | 14.409 | 30.426 | 13.458 | 2.107 | 10.921 | 4.289 | 1600.624 | -499.132 | 1602.092 | -500.730 | 1601.145 | -500.281 | 1649.799 | -500.352 | 35983.680 | 2675.778 | 2678.728 | 2.576 | 10.898 | 3.801 | 450.392 | 60.466 | 40.090 | 9.791 | 12.004 | 6.096 | 12.010 | 6.099 | 13.224 | 6.629 | 25.322 | 19.651 | 89.114 | 6.496 | 0.497 | 20.420 | 1.917 | 1013.927 | -300.413 | 1565.304 | -400.251 | 1554.094 | -400.046 | 1401.438 | -399.365 | 1209.730 | -399.788 | 1058.325 | -399.727 | 12.598 | 3.202 | 9.936 | 4.168 | 25.053 | -399.925 | 18.903 | -399.923 | 20.044 | -399.098 | 18.076 | -399.493 | 20.043 | -399.231 | 10.067 | -399.842 | 9.359 | -405.416 | 4.996 | -400.224 | 22.989 | -505.568 | 3 | 11 | 8 | 2016 | 3 |
list_prisnaks = ['year', 'month', 'day_month', 'day_week', 'hour']
title_base = "Распределение количества пропущенных значений по "
list_titles = ['годам', 'месяцам', 'дням месяца', 'дням недели', 'времени суток']
days_in_month = [
'Январь', 'Февраль', 'Март', 'Апрель',
'Май', 'Июнь', 'Июль', 'Август',
'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
]
days_week = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница',
'Суббота', 'Воскресенье']
def correct_data(axes_x, axes_y, num_prisnak):
if num_prisnak == 'month':
res_axes_y = []
for i in range(12):
res_axes_y.append(0)
for days_month in axes_x:
res_axes_y[days_in_month.index(days_in_month[days_month])] = \
axes_y[days_in_month.index(days_in_month[days_month])-1]
return days_in_month, res_axes_y
if num_prisnak == 'day_week':
res_axes_y = []
for i in range(7):
res_axes_y.append(0)
for i in range(7):
res_axes_y[axes_x[i]] = axes_y[axes_x.index(axes_x[i])]
return days_week, res_axes_y
for num_prisnak in tqdm(range(len(list_prisnaks))):
list_X = list(data['train'][list_prisnaks[num_prisnak]].unique())
list_empties = []
for x in list_X:
df = data['train'][data['train'][list_prisnaks[num_prisnak]] == x]
list_empties.append(df.isna().sum().sum())
if list_prisnaks[num_prisnak] in ['month', 'day_week']:
list_X, list_empties = correct_data(list_X, list_empties,
list_prisnaks[num_prisnak])
plt.figure(figsize = (8,6))
plt.bar(list_X, list_empties)
for i in range(len(list_X)):
plt.text(list_X[i], list_empties[i], int(list_empties[i]),
horizontalalignment='center', verticalalignment='bottom',
fontdict={'fontweight':500, 'size':10})
if list_prisnaks[num_prisnak] == 'day_month':
plt.xticks([1, 5, 10, 15, 20, 25, 30], fontsize=10, color='blue')
elif list_prisnaks[num_prisnak] in ['month', 'day_week']:
plt.xticks(list_X, fontsize=10, color='blue', rotation=45)
else:
plt.xticks(list_X, fontsize=10, color='blue')
my_title = title_base + list_titles[num_prisnak]
plt.title(my_title, fontsize=12, color='red')
plt.show()
0%| | 0/5 [00:00<?, ?it/s]
Из приведенных распределений отмечаем:
# Проверим, какие признаки есть в нашем датасете:
data['train'].head(2)
| date | final.output.concentrate_ag | final.output.concentrate_pb | final.output.concentrate_sol | final.output.concentrate_au | final.output.recovery | final.output.tail_ag | final.output.tail_pb | final.output.tail_sol | final.output.tail_au | primary_cleaner.input.sulfate | primary_cleaner.input.depressant | primary_cleaner.input.feed_size | primary_cleaner.input.xanthate | primary_cleaner.output.concentrate_ag | primary_cleaner.output.concentrate_pb | primary_cleaner.output.concentrate_sol | primary_cleaner.output.concentrate_au | primary_cleaner.output.tail_ag | primary_cleaner.output.tail_pb | primary_cleaner.output.tail_sol | primary_cleaner.output.tail_au | primary_cleaner.state.floatbank8_a_air | primary_cleaner.state.floatbank8_a_level | primary_cleaner.state.floatbank8_b_air | primary_cleaner.state.floatbank8_b_level | primary_cleaner.state.floatbank8_c_air | primary_cleaner.state.floatbank8_c_level | primary_cleaner.state.floatbank8_d_air | primary_cleaner.state.floatbank8_d_level | rougher.calculation.sulfate_to_au_concentrate | rougher.calculation.floatbank10_sulfate_to_au_feed | rougher.calculation.floatbank11_sulfate_to_au_feed | rougher.calculation.au_pb_ratio | rougher.input.feed_ag | rougher.input.feed_pb | rougher.input.feed_rate | rougher.input.feed_size | rougher.input.feed_sol | rougher.input.feed_au | rougher.input.floatbank10_sulfate | rougher.input.floatbank10_xanthate | rougher.input.floatbank11_sulfate | rougher.input.floatbank11_xanthate | rougher.output.concentrate_ag | rougher.output.concentrate_pb | rougher.output.concentrate_sol | rougher.output.concentrate_au | rougher.output.recovery | rougher.output.tail_ag | rougher.output.tail_pb | rougher.output.tail_sol | rougher.output.tail_au | rougher.state.floatbank10_a_air | rougher.state.floatbank10_a_level | rougher.state.floatbank10_b_air | rougher.state.floatbank10_b_level | rougher.state.floatbank10_c_air | rougher.state.floatbank10_c_level | rougher.state.floatbank10_d_air | rougher.state.floatbank10_d_level | rougher.state.floatbank10_e_air | rougher.state.floatbank10_e_level | rougher.state.floatbank10_f_air | rougher.state.floatbank10_f_level | secondary_cleaner.output.tail_ag | secondary_cleaner.output.tail_pb | secondary_cleaner.output.tail_sol | secondary_cleaner.output.tail_au | secondary_cleaner.state.floatbank2_a_air | secondary_cleaner.state.floatbank2_a_level | secondary_cleaner.state.floatbank2_b_air | secondary_cleaner.state.floatbank2_b_level | secondary_cleaner.state.floatbank3_a_air | secondary_cleaner.state.floatbank3_a_level | secondary_cleaner.state.floatbank3_b_air | secondary_cleaner.state.floatbank3_b_level | secondary_cleaner.state.floatbank4_a_air | secondary_cleaner.state.floatbank4_a_level | secondary_cleaner.state.floatbank4_b_air | secondary_cleaner.state.floatbank4_b_level | secondary_cleaner.state.floatbank5_a_air | secondary_cleaner.state.floatbank5_a_level | secondary_cleaner.state.floatbank5_b_air | secondary_cleaner.state.floatbank5_b_level | secondary_cleaner.state.floatbank6_a_air | secondary_cleaner.state.floatbank6_a_level | hour | day_month | month | year | day_week | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2016-01-15 00:00:00 | 6.055 | 9.890 | 5.507 | 42.192 | 70.541 | 10.412 | 0.895 | 16.904 | 2.143 | 127.092 | 10.128 | 7.250 | 0.989 | 8.548 | 10.390 | 19.529 | 34.174 | 14.937 | 2.535 | 7.476 | 2.107 | 1549.776 | -498.912 | 1551.434 | -516.403 | 1549.874 | -498.667 | 1554.367 | -493.428 | 41885.707 | 3481.779 | 3520.337 | 2.839 | 6.100 | 2.285 | 523.546 | 55.487 | 36.809 | 6.486 | 11.987 | 6.008 | 11.837 | 6.006 | 11.501 | 7.101 | 28.029 | 19.794 | 87.108 | 5.008 | 0.509 | 19.154 | 1.170 | 999.707 | -404.067 | 1603.011 | -434.715 | 1602.375 | -442.204 | 1598.937 | -451.294 | 1404.472 | -455.463 | 1416.355 | -451.940 | 14.500 | 4.695 | 8.765 | 2.606 | 25.853 | -498.526 | 23.894 | -501.406 | 23.962 | -495.263 | 21.940 | -499.341 | 14.017 | -502.488 | 12.100 | -504.716 | 9.926 | -498.310 | 8.080 | -500.471 | 14.151 | -605.842 | 0 | 15 | 1 | 2016 | 4 |
| 1 | 2016-01-15 01:00:00 | 6.029 | 9.969 | 5.258 | 42.702 | 69.266 | 10.463 | 0.927 | 16.635 | 2.225 | 125.629 | 10.296 | 7.250 | 1.003 | 8.559 | 10.497 | 19.369 | 34.119 | 16.251 | 3.050 | 6.734 | 2.353 | 1576.167 | -500.905 | 1575.951 | -499.866 | 1575.994 | -499.315 | 1574.479 | -498.932 | 42050.862 | 3498.371 | 3489.982 | 2.859 | 6.161 | 2.266 | 525.291 | 57.279 | 35.753 | 6.479 | 11.971 | 6.006 | 11.996 | 6.013 | 11.616 | 7.279 | 28.067 | 20.051 | 86.843 | 4.955 | 0.537 | 18.965 | 1.185 | 1000.286 | -400.065 | 1600.755 | -449.953 | 1600.480 | -449.831 | 1600.528 | -449.954 | 1399.227 | -450.870 | 1399.720 | -450.119 | 14.265 | 4.593 | 9.001 | 2.488 | 25.881 | -499.990 | 23.890 | -500.372 | 23.971 | -500.085 | 22.086 | -499.447 | 13.992 | -505.503 | 11.951 | -501.332 | 10.039 | -500.170 | 7.985 | -500.582 | 13.998 | -599.787 | 1 | 15 | 1 | 2016 | 4 |
delete_col = ['hour', 'day_month', 'month', 'year', 'day_week']
data['train'] = data['train'].drop(delete_col, axis=1)
# Проверим, что принзнаки удалены:
data['train'].head(2)
| date | final.output.concentrate_ag | final.output.concentrate_pb | final.output.concentrate_sol | final.output.concentrate_au | final.output.recovery | final.output.tail_ag | final.output.tail_pb | final.output.tail_sol | final.output.tail_au | primary_cleaner.input.sulfate | primary_cleaner.input.depressant | primary_cleaner.input.feed_size | primary_cleaner.input.xanthate | primary_cleaner.output.concentrate_ag | primary_cleaner.output.concentrate_pb | primary_cleaner.output.concentrate_sol | primary_cleaner.output.concentrate_au | primary_cleaner.output.tail_ag | primary_cleaner.output.tail_pb | primary_cleaner.output.tail_sol | primary_cleaner.output.tail_au | primary_cleaner.state.floatbank8_a_air | primary_cleaner.state.floatbank8_a_level | primary_cleaner.state.floatbank8_b_air | primary_cleaner.state.floatbank8_b_level | primary_cleaner.state.floatbank8_c_air | primary_cleaner.state.floatbank8_c_level | primary_cleaner.state.floatbank8_d_air | primary_cleaner.state.floatbank8_d_level | rougher.calculation.sulfate_to_au_concentrate | rougher.calculation.floatbank10_sulfate_to_au_feed | rougher.calculation.floatbank11_sulfate_to_au_feed | rougher.calculation.au_pb_ratio | rougher.input.feed_ag | rougher.input.feed_pb | rougher.input.feed_rate | rougher.input.feed_size | rougher.input.feed_sol | rougher.input.feed_au | rougher.input.floatbank10_sulfate | rougher.input.floatbank10_xanthate | rougher.input.floatbank11_sulfate | rougher.input.floatbank11_xanthate | rougher.output.concentrate_ag | rougher.output.concentrate_pb | rougher.output.concentrate_sol | rougher.output.concentrate_au | rougher.output.recovery | rougher.output.tail_ag | rougher.output.tail_pb | rougher.output.tail_sol | rougher.output.tail_au | rougher.state.floatbank10_a_air | rougher.state.floatbank10_a_level | rougher.state.floatbank10_b_air | rougher.state.floatbank10_b_level | rougher.state.floatbank10_c_air | rougher.state.floatbank10_c_level | rougher.state.floatbank10_d_air | rougher.state.floatbank10_d_level | rougher.state.floatbank10_e_air | rougher.state.floatbank10_e_level | rougher.state.floatbank10_f_air | rougher.state.floatbank10_f_level | secondary_cleaner.output.tail_ag | secondary_cleaner.output.tail_pb | secondary_cleaner.output.tail_sol | secondary_cleaner.output.tail_au | secondary_cleaner.state.floatbank2_a_air | secondary_cleaner.state.floatbank2_a_level | secondary_cleaner.state.floatbank2_b_air | secondary_cleaner.state.floatbank2_b_level | secondary_cleaner.state.floatbank3_a_air | secondary_cleaner.state.floatbank3_a_level | secondary_cleaner.state.floatbank3_b_air | secondary_cleaner.state.floatbank3_b_level | secondary_cleaner.state.floatbank4_a_air | secondary_cleaner.state.floatbank4_a_level | secondary_cleaner.state.floatbank4_b_air | secondary_cleaner.state.floatbank4_b_level | secondary_cleaner.state.floatbank5_a_air | secondary_cleaner.state.floatbank5_a_level | secondary_cleaner.state.floatbank5_b_air | secondary_cleaner.state.floatbank5_b_level | secondary_cleaner.state.floatbank6_a_air | secondary_cleaner.state.floatbank6_a_level | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2016-01-15 00:00:00 | 6.055 | 9.890 | 5.507 | 42.192 | 70.541 | 10.412 | 0.895 | 16.904 | 2.143 | 127.092 | 10.128 | 7.250 | 0.989 | 8.548 | 10.390 | 19.529 | 34.174 | 14.937 | 2.535 | 7.476 | 2.107 | 1549.776 | -498.912 | 1551.434 | -516.403 | 1549.874 | -498.667 | 1554.367 | -493.428 | 41885.707 | 3481.779 | 3520.337 | 2.839 | 6.100 | 2.285 | 523.546 | 55.487 | 36.809 | 6.486 | 11.987 | 6.008 | 11.837 | 6.006 | 11.501 | 7.101 | 28.029 | 19.794 | 87.108 | 5.008 | 0.509 | 19.154 | 1.170 | 999.707 | -404.067 | 1603.011 | -434.715 | 1602.375 | -442.204 | 1598.937 | -451.294 | 1404.472 | -455.463 | 1416.355 | -451.940 | 14.500 | 4.695 | 8.765 | 2.606 | 25.853 | -498.526 | 23.894 | -501.406 | 23.962 | -495.263 | 21.940 | -499.341 | 14.017 | -502.488 | 12.100 | -504.716 | 9.926 | -498.310 | 8.080 | -500.471 | 14.151 | -605.842 |
| 1 | 2016-01-15 01:00:00 | 6.029 | 9.969 | 5.258 | 42.702 | 69.266 | 10.463 | 0.927 | 16.635 | 2.225 | 125.629 | 10.296 | 7.250 | 1.003 | 8.559 | 10.497 | 19.369 | 34.119 | 16.251 | 3.050 | 6.734 | 2.353 | 1576.167 | -500.905 | 1575.951 | -499.866 | 1575.994 | -499.315 | 1574.479 | -498.932 | 42050.862 | 3498.371 | 3489.982 | 2.859 | 6.161 | 2.266 | 525.291 | 57.279 | 35.753 | 6.479 | 11.971 | 6.006 | 11.996 | 6.013 | 11.616 | 7.279 | 28.067 | 20.051 | 86.843 | 4.955 | 0.537 | 18.965 | 1.185 | 1000.286 | -400.065 | 1600.755 | -449.953 | 1600.480 | -449.831 | 1600.528 | -449.954 | 1399.227 | -450.870 | 1399.720 | -450.119 | 14.265 | 4.593 | 9.001 | 2.488 | 25.881 | -499.990 | 23.890 | -500.372 | 23.971 | -500.085 | 22.086 | -499.447 | 13.992 | -505.503 | 11.951 | -501.332 | 10.039 | -500.170 | 7.985 | -500.582 | 13.998 | -599.787 |
print('Список признаков, в которых число пропусков превышает 100:')
list_empty = []
list_columns = []
for i in tqdm(range(data['train'].shape[1])):
if( data['train'].isna().sum()[i] > 100):
list_empty.append(data['train'].isna().sum()[i])
list_columns.append(data['train'].columns[i])
df = pd.DataFrame(list(zip(list_columns, list_empty)), \
columns=['Признак', 'Кол-во пропусков'])
df
Список признаков, в которых число пропусков превышает 100:
0%| | 0/87 [00:00<?, ?it/s]
| Признак | Кол-во пропусков | |
|---|---|---|
| 0 | final.output.concentrate_sol | 211 |
| 1 | primary_cleaner.output.concentrate_sol | 286 |
| 2 | rougher.input.feed_size | 144 |
| 3 | rougher.input.floatbank11_xanthate | 428 |
| 4 | rougher.state.floatbank10_e_air | 436 |
| 5 | secondary_cleaner.output.tail_sol | 1605 |
| 6 | secondary_cleaner.state.floatbank2_a_air | 217 |
Видим:
Нет признаков, которые бы вместе были пропущены в сколь-нибудь значимом количестве. А потому, были бы взаимозависимы физически.
Больше всего пропусков в значении 'sol' (solvent) - концентрации раствора/коллоида.
list_cols = ['date', 'secondary_cleaner.output.tail_sol']
dframe = data['train'][list_cols].copy()
# переведём столбец с датой в тип datetime "дата"
dframe['date'] = pd.to_datetime(dframe['date'], errors='coerce')
dframe['hour'] = pd.DatetimeIndex(dframe['date']).hour
dframe['day_month'] = pd.DatetimeIndex(dframe['date']).day
dframe['month'] = pd.DatetimeIndex(dframe['date']).month
dframe['year'] = pd.DatetimeIndex(dframe['date']).year
days_in_week={0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6}
dframe['day_week']=pd.DatetimeIndex(dframe['date']).weekday.map(days_in_week)
dframe.head(2)
| date | secondary_cleaner.output.tail_sol | hour | day_month | month | year | day_week | |
|---|---|---|---|---|---|---|---|
| 0 | 2016-01-15 00:00:00 | 8.765 | 0 | 15 | 1 | 2016 | 4 |
| 1 | 2016-01-15 01:00:00 | 9.001 | 1 | 15 | 1 | 2016 | 4 |
for num_prisnak in tqdm(range(len(list_prisnaks))):
list_X = list(dframe[list_prisnaks[num_prisnak]].unique())
list_empties = []
for x in list_X:
df = dframe[dframe[list_prisnaks[num_prisnak]] == x]
list_empties.append(df.isna().sum().sum())
if list_prisnaks[num_prisnak] in ['month', 'day_week']:
list_X, list_empties = correct_data(list_X, list_empties,
list_prisnaks[num_prisnak])
plt.figure(figsize = (8,6))
plt.bar(list_X, list_empties)
for i in range(len(list_X)):
plt.text(list_X[i], list_empties[i], int(list_empties[i]),
horizontalalignment='center', verticalalignment='bottom',
fontdict={'fontweight':500, 'size':10})
if list_prisnaks[num_prisnak] == 'day_month':
plt.xticks([1, 5, 10, 15, 20, 25, 30], fontsize=10, color='blue')
elif list_prisnaks[num_prisnak] in ['month', 'day_week']:
plt.xticks(list_X, fontsize=10, color='blue', rotation=45)
else:
plt.xticks(list_X, fontsize=10, color='blue')
my_title = title_base + list_titles[num_prisnak]
plt.title(my_title, fontsize=12, color='red')
plt.show()
0%| | 0/5 [00:00<?, ?it/s]
sum1 = dframe['secondary_cleaner.output.tail_sol'].count()
dframe = dframe[(dframe.year == 2018) & (dframe.month > 2) & (dframe.month < 8)]
sum2 = dframe['secondary_cleaner.output.tail_sol'].count()
print('\nТаким образом, приходим к выводу, что из', sum1, 'пропусков признака')
print('"secondary_cleaner.output.tail_sol" {:d} ( {:.2%} )'.format(sum2, sum2/sum1), end='')
print(' приходится на \nапрель-август 2018 года.\n')
Таким образом, приходим к выводу, что из 12544 пропусков признака "secondary_cleaner.output.tail_sol" 1762 ( 14.05% ) приходится на апрель-август 2018 года.
sum1 = dframe['secondary_cleaner.output.tail_sol'].isna().sum()
dframe = dframe[(dframe.year == 2018) & (dframe.month > 2) & (dframe.month < 8)]
sum2 = dframe['secondary_cleaner.output.tail_sol'].isna().sum()
print('\nТаким образом, приходим к выводу, что из', sum1, 'пропусков признака')
print('"secondary_cleaner.output.tail_sol" {:d} ( {:.2%} )'.format(sum2, sum2/sum1), end='')
print(' приходится на \nапрель-август 2018 года.\n')
Таким образом, приходим к выводу, что из 1354 пропусков признака "secondary_cleaner.output.tail_sol" 1354 ( 100.00% ) приходится на апрель-август 2018 года.
В задании на проект указано: "Соседние по времени параметры часто похожи." Это понятно, так как переданные нам данные - это результаты последовательных измерений в ходе технологического процесса.
Заполним пропуски ближайшими значениями.
print("Количество пропущенных данных в исходных датасетах:")
for key_df in data:
print(key_df, ':', data[key_df].isna().sum().sum())
# Для заполнения пропусков ближайшими значениями воспользуемся методом ffill() методом 'bfill':
for key_df in data:
data[key_df] = data[key_df].fillna(method='ffill')
Separating_line()
print("Количество пропущенных данных после заполнения пропусков:")
for key_df in data:
print(key_df, ':', data[key_df].isna().sum().sum())
Количество пропущенных данных в исходных датасетах: full : 4481 train : 4100 test : 90 -------------------------------------------------------------------------------- Количество пропущенных данных после заполнения пропусков: full : 0 train : 0 test : 0
lack = sorted(list(set(data['train'].columns) - set(data['test'].columns)))
for i in range(len(lack)):
print(i+1, ' - ', lack[i])
1 - final.output.concentrate_ag 2 - final.output.concentrate_au 3 - final.output.concentrate_pb 4 - final.output.concentrate_sol 5 - final.output.recovery 6 - final.output.tail_ag 7 - final.output.tail_au 8 - final.output.tail_pb 9 - final.output.tail_sol 10 - primary_cleaner.output.concentrate_ag 11 - primary_cleaner.output.concentrate_au 12 - primary_cleaner.output.concentrate_pb 13 - primary_cleaner.output.concentrate_sol 14 - primary_cleaner.output.tail_ag 15 - primary_cleaner.output.tail_au 16 - primary_cleaner.output.tail_pb 17 - primary_cleaner.output.tail_sol 18 - rougher.calculation.au_pb_ratio 19 - rougher.calculation.floatbank10_sulfate_to_au_feed 20 - rougher.calculation.floatbank11_sulfate_to_au_feed 21 - rougher.calculation.sulfate_to_au_concentrate 22 - rougher.output.concentrate_ag 23 - rougher.output.concentrate_au 24 - rougher.output.concentrate_pb 25 - rougher.output.concentrate_sol 26 - rougher.output.recovery 27 - rougher.output.tail_ag 28 - rougher.output.tail_au 29 - rougher.output.tail_pb 30 - rougher.output.tail_sol 31 - secondary_cleaner.output.tail_ag 32 - secondary_cleaner.output.tail_au 33 - secondary_cleaner.output.tail_pb 34 - secondary_cleaner.output.tail_sol
Видим, что:
Это находится в полном соответствии с заданием: "Некоторые параметры недоступны, потому что замеряются и/или рассчитываются значительно позже."
Поэтому таких данных у нас и нет.
В условии задания указано, что: "В тестовом наборе нет целевых признаков."
Их действительно нет. Поэтому добавим целевые признаки 'rougher.output.recovery' и 'final.output.recovery' из исходных данных датасета data['full'] в тестовую выборку data['test'] с помощью метода .merge() по столбцу 'date':
data['test'] = data['test'].merge(data['full'].loc[:,
['date',"rougher.output.recovery","final.output.recovery"]],on = 'date')
# Проверим, что количество признаков увеличилось по сравнению с изначальным (53):
data['test'].shape
(5290, 55)
# Посмотрим парочку реальных данных с добавленными признаками:
data['test'].sample(2)
| date | primary_cleaner.input.sulfate | primary_cleaner.input.depressant | primary_cleaner.input.feed_size | primary_cleaner.input.xanthate | primary_cleaner.state.floatbank8_a_air | primary_cleaner.state.floatbank8_a_level | primary_cleaner.state.floatbank8_b_air | primary_cleaner.state.floatbank8_b_level | primary_cleaner.state.floatbank8_c_air | primary_cleaner.state.floatbank8_c_level | primary_cleaner.state.floatbank8_d_air | primary_cleaner.state.floatbank8_d_level | rougher.input.feed_ag | rougher.input.feed_pb | rougher.input.feed_rate | rougher.input.feed_size | rougher.input.feed_sol | rougher.input.feed_au | rougher.input.floatbank10_sulfate | rougher.input.floatbank10_xanthate | rougher.input.floatbank11_sulfate | rougher.input.floatbank11_xanthate | rougher.state.floatbank10_a_air | rougher.state.floatbank10_a_level | rougher.state.floatbank10_b_air | rougher.state.floatbank10_b_level | rougher.state.floatbank10_c_air | rougher.state.floatbank10_c_level | rougher.state.floatbank10_d_air | rougher.state.floatbank10_d_level | rougher.state.floatbank10_e_air | rougher.state.floatbank10_e_level | rougher.state.floatbank10_f_air | rougher.state.floatbank10_f_level | secondary_cleaner.state.floatbank2_a_air | secondary_cleaner.state.floatbank2_a_level | secondary_cleaner.state.floatbank2_b_air | secondary_cleaner.state.floatbank2_b_level | secondary_cleaner.state.floatbank3_a_air | secondary_cleaner.state.floatbank3_a_level | secondary_cleaner.state.floatbank3_b_air | secondary_cleaner.state.floatbank3_b_level | secondary_cleaner.state.floatbank4_a_air | secondary_cleaner.state.floatbank4_a_level | secondary_cleaner.state.floatbank4_b_air | secondary_cleaner.state.floatbank4_b_level | secondary_cleaner.state.floatbank5_a_air | secondary_cleaner.state.floatbank5_a_level | secondary_cleaner.state.floatbank5_b_air | secondary_cleaner.state.floatbank5_b_level | secondary_cleaner.state.floatbank6_a_air | secondary_cleaner.state.floatbank6_a_level | rougher.output.recovery | final.output.recovery | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1024 | 2016-10-23 18:59:59 | 143.943 | 5.504 | 7.200 | 0.898 | 1559.850 | -499.867 | 1700.471 | -500.917 | 1703.047 | -502.452 | 1699.290 | -498.999 | 9.041 | 3.541 | 379.514 | 44.243 | 35.141 | 10.541 | 12.994 | 5.998 | 13.005 | 6.002 | 1000.498 | -499.887 | 1499.668 | -400.079 | 1499.258 | -399.697 | 1401.288 | -400.721 | 1299.342 | -300.179 | 1299.316 | -298.932 | 32.015 | -462.688 | 26.948 | -500.425 | 32.996 | -504.981 | 31.076 | -508.773 | 19.974 | -500.476 | 16.934 | -500.297 | 16.988 | -499.732 | 14.005 | -499.536 | 24.998 | -497.214 | 92.045 | 68.616 |
| 2691 | 2017-09-07 23:59:59 | 111.869 | 2.909 | 7.167 | 1.094 | 1602.274 | -500.240 | 1601.931 | -498.860 | 1602.407 | -511.542 | 1599.053 | -508.246 | 5.799 | 3.536 | 501.290 | 73.133 | 40.848 | 6.340 | 13.000 | 4.301 | 12.999 | 4.301 | 996.029 | -300.048 | 1298.277 | -500.269 | 1249.823 | -499.796 | 1200.528 | -499.460 | 1000.773 | -499.349 | 1000.540 | -499.226 | 30.026 | -499.961 | 23.012 | -502.380 | 25.021 | -500.250 | 15.015 | -500.241 | 11.986 | -499.281 | 8.872 | -398.625 | 13.978 | -500.930 | 10.749 | -500.357 | 15.005 | -499.744 | 79.296 | 85.147 |
Убедились, что целевые признаки 'rougher.output.recovery' и 'final.output.recovery' добавлены в тестовую выборку.
Посмотрим взаимную корреляцию признаков датасета на графике heatmap:
# Чтобы видеть, что процесс выполняется, поставим tqdm с разовым циклом:
for i in tqdm(range(1)):
# Распечатаем коэффициенты Пирсона на всю длину таблицы:
# with pd.option_context('display.max_rows', None,
# 'display.max_columns', None,
# 'display.precision', 1,
# ):
# display(data['train'].corr())
plt.figure(figsize=(40,40))
sns.heatmap(data['train'].corr(), annot=True, annot_kws={"size":6}, fmt = '.2f',
cbar= False )
plt.show()
0%| | 0/1 [00:00<?, ?it/s]
Отмечено наличие пар признаков с высоким уровнем взаимного влияния. Для моделей 'Дерево решений' и 'Случайное дерево' сильное взаимное влияние признаков не окажет негативного эффекта, а вот при 'Регрессии' нужно быть внимательнее.
Построим гистограммы для всех признаков датасета 'train':
# Чтобы видеть, что процесс выполняется, поставим tqdm с разовым циклом:
for i in tqdm(range(1)):
fig = data['train'].hist(figsize=(20, 20), bins=10, alpha=1.0,
xlabelsize=6, ylabelsize=6)
[x.title.set_size(6) for x in fig.ravel()]
plt.show()
0%| | 0/1 [00:00<?, ?it/s]
В основном наблюдаем нормальное распределение данных признаков.
Для подготовки данных к последующей обработке были проведены следующие операции и сделаны следующие промежуточные выводы:
1.Успешно загружены данные из трех файлов:
2.Размер датасетов:
3.Набор данных довольно большой. В обучающей выборке 14 149 строк х 87 столбцов. В тестовой выборке 5 290 строк х 53 столбцов.
4.Дубликатов в таблицах нет.
5.Расхождение между реальными и расчетными значениями эффективности обогащения близки к 0 (1e-16). Эффективность обогащения рассчитана правильно.
6.Изучено распределение пропущенных значений по времени:
7.Пропуски заполнены ближайшими значениями, в соответствии с заданием: "Соседние по времени параметры часто похожи".
8.Добавлены целевые признаки 'rougher.output.recovery' и 'final.output.recovery' из исходных данных датасета data['full'] в тестовую выборку data['test'] с помощью метода .merge() по столбцу 'date':
9.В датасете 'test' по сравнению с 'full', отсутствуют значения параметров продукта 'output' по всем операциям и по всем элементам, получаемые после выполнения основных операций. Это находится в полном соответствии с заданием: "Некоторые параметры недоступны, потому что замеряются и/или рассчитываются значительно позже."
10.Изучены данные на мультиколлинеарность признаков. Для моделей 'Дерево решений' и 'Случайное дерево' сильное взаимное влияние признаков не окажет негативного эффекта, а вот при 'Регрессии' нужно быть внимательнее.
11.Построены гистограммы для всех признаков датасета 'train'. В основном наблюдаем нормальное распределение данных признаков.
Задачи:
1.Посмотреть, как меняется концентрация металлов (Au, Ag, Pb) на различных этапах очистки. Описать выводы.
2.Сравнить распределения размеров гранул сырья на обучающей и тестовой выборках. Если распределения сильно отличаются друг от друга, оценка модели будет неправильной.
3.Исследовать суммарную концентрацию всех веществ на разных стадиях: в сырье, в черновом и финальном концентратах.
procedure = [
'rougher.input.feed_',
'rougher.output.concentrate_',
'primary_cleaner.output.concentrate_',
'final.output.concentrate_',
]
legend_rus = ['исходная руда', 'после флотации',
'после первичной очистки', 'в готовом концентрате']
metals = ['au', 'ag', 'pb']
for metal in tqdm(metals):
plt.figure(figsize=(10, 6))
plt.grid(True)
plt.xlabel('Концентрация, г/т')
plt.ylabel('Количество измерений')
plt.title(f'Динамика изменения концентрации {metal.title()} на различных стадиях производственного процесса.')
for proc in procedure:
df = data['train'][f'{proc}{metal}']
plt.hist(df, bins=100, alpha=0.8)
plt.legend(legend_rus)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем, что в распределениях со значениями концентрации присутствуют аномальные значения концентраций, равные нулю (самый левый пик).
Удалим их. Это улучшит работу модели.
print('Размер датасета до удаления нулевых значений концентраций металлов:', data['train'].shape)
columns_with_concentrate = [column for column in data['train'].columns if 'concentrate_' in column]
for column in columns_with_concentrate:
data['train'] = data['train'][data['train'][column] > 0]
print('Размер датасета после удаления нулевых значений концентраций металлов:', data['train'].shape)
Размер датасета до удаления нулевых значений концентраций металлов: (14149, 87) Размер датасета после удаления нулевых значений концентраций металлов: (13716, 87)
# Диаграмма размаха («ящик с усами») по распределению
# концентрации металлов (Au, Ag, Pb) на различных этапах очистки.
for n_metal in tqdm(range(len(metals))):
fig = plt.figure(figsize = (12,4))
print('Элемент', metals[n_metal].title())
for n_proc in range(len(procedure)):
ax = fig.add_subplot(n_metal+1, 4, n_proc+1)
sns.boxplot(data['train'][f'{procedure[n_proc]}{metals[n_metal]}'], ax=ax)
ax.set_title(legend_rus[n_proc])
plt.xlabel("'Концентрация, г/т'")
plt.show()
0%| | 0/3 [00:00<?, ?it/s]
Элемент Au
Элемент Ag
Элемент Pb
Промежуточные выводы
Концентрация золота повышается с каждым этапом. Цель производства - повысить концентрацию золота является достижимой. Содержание Au в результате повышается в 7-8 раз.
Концентрация серебра понижается с каждым шагом очистки. Судя по всему, основная цель предприятия - добыча золота и хозяева готовы мириться с потерей сопутствующего серебра.
Хотя это и довольно расточительно. В готовом концентрате содержание Ag около 5 грамм/тонну. В исходной руде серебра было около 7.5 г/т. Таким образом, потери составили около 2.5 г/т. При среднем для такого рода предприятий значения объёма добытой руды в 1 млн тонн, компания теряет около 2,5 тонны серебра в год. Что при нынешних ценах на серебро в 66.5 руб за грамм: https://investfunds.ru/indexes/225/?ysclid=lgux43pt30329660739 может стоить около 160 млн рублей. А если компания вообще не извлекает серебро, то упущенная выгода оценивается в 0.5 млрд рублей ежегодно.
Концентрация свинца повышается с 2.5 г/т в исходном сырье до примерно 10 г/т в готовом концентрате.
К сожалению, нет информации по содержанию Cu. А это - основа золотосодержащей руды.
Нулевые значения (они могут возникнуть только при отсутствии аналитического сигнала мы убрали.
Остальные отклонения от нормального распределения трогать не будем. Совсем уж аномальных (в десятки раз) значений не наблюдаем.
Поработаем с параметром 'feed size' — размер гранул сырья.
В каждой из выборок есть следующие признаки размера гранул:
Посмотрим их:
print('Обучающая выборка:')
display(data['train'][['rougher.input.feed_size', 'primary_cleaner.input.feed_size']].head(2))
print('Тестовая выборка:')
display(data['test'][['rougher.input.feed_size', 'primary_cleaner.input.feed_size']].head(2))
Обучающая выборка:
| rougher.input.feed_size | primary_cleaner.input.feed_size | |
|---|---|---|
| 0 | 55.487 | 7.250 |
| 1 | 57.279 | 7.250 |
Тестовая выборка:
| rougher.input.feed_size | primary_cleaner.input.feed_size | |
|---|---|---|
| 0 | 62.710 | 8.080 |
| 1 | 61.961 | 8.080 |
Отмечаем, что раздробили и размололи в 7-8 раз.
# Расситаем коэффициенты корреляции Пирсона.
# Данных не много. Цикл вводить не будем.
print(round(data['train']['rougher.input.feed_size'].corr(data['train']['rougher.output.recovery']), 2))
print(round(data['train']['rougher.input.feed_size'].corr(data['train']['final.output.recovery']), 2))
print()
print(round(data['test']['primary_cleaner.input.feed_size'].corr(data['test']['rougher.output.recovery']), 2))
print(round(data['test']['primary_cleaner.input.feed_size'].corr(data['test']['final.output.recovery']), 2))
0.09 0.05 0.01 0.07
# Построим распределение ПЛОТНОСТИ размера гранул исходного сырья (признак 'rougher.input.feed_size')
# на обучающей и тестовой выборках:
data['train']['rougher.input.feed_size'].hist(figsize=(12, 6), bins=100, density=True)
data['test']['rougher.input.feed_size'].hist(figsize=(12, 6), bins=100, density=True)
plt.grid(True)
plt.legend(['Обучающая выборка',
'Тестовая выборка'])
plt.xlabel("Размер гранул.")
plt.ylabel('Количество измерений')
plt.title("Распределения ПЛОТНОСТИ размера гранул До флотации, т.е. исходного сырья.")
plt.show()
# Диаграмма размаха («ящик с усами») по распределению размеров гранул До флотации, т.е. исходного сырья.
fig = plt.figure(figsize = (12,4))
ax = fig.add_subplot(1, 2, 1)
sns.boxplot(data['train']['rougher.input.feed_size'], ax=ax)
ax.set_title('Обучающая выборка. До флотации')
plt.xlabel("Размер гранул.")
ax = fig.add_subplot(1, 2, 2)
sns.boxplot(data['test']['rougher.input.feed_size'], ax=ax)
ax.set_title('Тестовая выборка. До флотации')
plt.xlabel("Размер гранул.")
plt.show()
Промежуточные выводы по распределению размера гранул гранул в исходной руде 'До' флотации:
в область более крупных размеров. 2. Отмечается много выбросов после размера гранул 100, вплоть до 500.
# Построим распределение ПЛОТНОСТИ размера гранул после флотации, т.е. до первичной очистки
# (признак 'primary_cleaner.input.feed_size') на обучающей и тестовой выборках:
data['train']['primary_cleaner.input.feed_size'].hist(figsize=(12, 6), bins=100, density=True)
data['test']['primary_cleaner.input.feed_size'].hist(figsize=(12, 6), bins=100, density=True)
plt.grid(True)
plt.legend(['Обучающая выборка',
'Тестовая выборка'])
plt.xlabel("Размер гранул.")
plt.ylabel('Количество измерений')
plt.title("Распределения ПЛОТНОСТИ размера гранул ПОСЛЕ флотации, т.е. до первичной очистки.")
plt.show()
# Диаграмма размаха («ящик с усами») по распределению размеров гранул ПОСЛЕ флотации, т.е. до первичной очистки.
fig = plt.figure(figsize = (12,4))
ax = fig.add_subplot(1, 2, 1)
sns.boxplot(data['train']['primary_cleaner.input.feed_size'], ax=ax)
ax.set_title('Обучающая выборка. ПОСЛЕ флотации')
plt.xlabel("Размер гранул.")
ax = fig.add_subplot(1, 2, 2)
sns.boxplot(data['test']['primary_cleaner.input.feed_size'], ax=ax)
ax.set_title('Тестовая выборка. ПОСЛЕ флотации')
plt.xlabel("Размер гранул.")
plt.show()
Промежуточные выводы по распределению размера гранул гранул в исходной руде 'ПОСЛЕ' флотации:
Распределения в обучающей и тестовой выборках очень похожии имеют нормальное распределение.
Размер гранул сильно (в 7-8 раз) уменьшился по сравнению с размером гранул 'До' флотации.
В обучающей выборке отмечены аномальные выбросы с крупностью как до 6, так и более 9.
В тестовой выборке выбросов с крупностью менее 6 почти нет, но есть аномальные выбросы размером более 9.
До флотации проведено примерно в 2 раза больше замеров, нежели после флотации.
procedure = [
'rougher.output.tail_',
'primary_cleaner.output.tail_',
'secondary_cleaner.output.tail_',
'final.output.tail_'
]
legend_rus = ['после флотации', 'после первичной очистки',
'после второй очистки', 'итоговые хвосты']
metals = ['au', 'ag', 'pb']
for metal in tqdm(metals):
plt.figure(figsize=(12, 6))
plt.grid(True)
plt.xlabel('Концентрация, г/т')
plt.ylabel('Количество измерений')
plt.title(f'Динамика изменения концентрации {metal.title()} в "хвостах" на различных стадиях производственного процесса.')
for proc in procedure:
df = data['train'][f'{proc}{metal}']
plt.hist(df, bins=100, alpha=0.8)
plt.legend(legend_rus)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем, что в распределениях со значениями концентрации 'в хвостах' присутствуют аномальные значения концентраций, равные нулю (самый левый пик).
Для улучшения работы модели удалим их.
print('Размер датасета до удаления нулевых значений концентраций металлов:', data['train'].shape)
columns_with_concentrate = [column for column in data['train'].columns if 'tail_' in column]
for column in columns_with_concentrate:
data['train'] = data['train'][data['train'][column] > 0]
print('Размер датасета после удаления нулевых значений концентраций металлов:', data['train'].shape)
Размер датасета до удаления нулевых значений концентраций металлов: (13716, 87) Размер датасета после удаления нулевых значений концентраций металлов: (12848, 87)
Промежуточные выводы:
Потери материалов с крупными содержаниями всех металлов идут в основном на стадиях очистки.
Признаки с информацией о содержании элементов в 'хвостах' были очищены от нулевых значений.
procedure = [
'rougher.input.feed_',
'rougher.output.concentrate_',
'primary_cleaner.output.concentrate_',
'final.output.concentrate_',
]
metals = ['au', 'ag', 'pb']
plt.figure(figsize=(12, 6))
plt.grid(True)
plt.xlabel('Суммарная Концентрация, г/т')
plt.ylabel('Количество измерений')
plt.title(f'Суммарная концентрации металлов (Au, Ag, Pb) на различных стадиях производственного процесса.')
for proc in procedure:
df = data['train'][f'{proc}au'] + data['train'][f'{proc}ag'] + data['train'][f'{proc}pb']
#df = data['train'][f'{proc}{metal}']
plt.hist(df, bins=100, alpha=0.8)
plt.legend(['исходная руда', 'после флотации',
'после первичной очистки', 'в готовом концентрате'])
Отмечаем:
Рассмотрим:
# Посмотрим распределение целевых признаков 'rougher.output.recovery' и 'final.output.recovery'
# в обучающей выборке (датасет gold_recovery_train_new):
data['train']['rougher.output.recovery'].hist(figsize=(12, 6), bins=50, alpha=0.7, edgecolor = 'black')
data['train']['final.output.recovery'].hist(figsize=(12, 6), bins=50, alpha=0.7, edgecolor = 'black')
plt.grid(True)
plt.legend(["Эффективность обогащения на стадии флотации 'rougher.output.recovery'",
"Эффективность обогащения на стадии очистки 'final.output.recovery'"])
plt.xlabel('Коэффициент эффективности')
plt.ylabel('Количество расчётов/измерений')
plt.title('Распределение эффективности обогащения сырья и готового концентрата в обучающей выборке')
plt.show()
Отмечаем:
for key_df in ['train', 'test']:
print("\nДатасет data '", key_df)
print(f'Начальное количество объектов: {initial_size[key_df]:_.0f}')
print(f'Количество объектов после всех преобразований: {data[key_df].shape[0]:_.0f}')
print(f'Сокращено : {initial_size[key_df] - data[key_df].shape[0]:.0f} объектов,',
f'что составляет: {(initial_size[key_df] - data[key_df].shape[0]) / initial_size[key_df]:.2%}'
)
Датасет data ' train Начальное количество объектов: 14_149 Количество объектов после всех преобразований: 12_848 Сокращено : 1301 объектов, что составляет: 9.19% Датасет data ' test Начальное количество объектов: 5_290 Количество объектов после всех преобразований: 5_290 Сокращено : 0 объектов, что составляет: 0.00%
Сокращение выборки составляет несколько процентов. Это допустимо.
1.Подготовлена программа по расчету межквартильного диапазона (‘iqr_outlier’)
2.Проведён анализ изменения концентрации металлов (Au, Ag, Pb) на различных этапах очистки.
Установлено:
3.Проведено сравнение распределений размеров гранул сырья на обучающей и тестовой выборках.
4.Проведён анализ изменения концентрации металлов (Au, Ag, Pb) в 'хвостах' на разных этапах техпроцесса.
5.Проведено исследование суммарной концентрации всех металлов (Au, Ag, Pb) на разных стадиях: в сырье, в черновом и финальном концентратах
Отмечено:
6.Изучено изменение эффективности обогащения на разных стадиях производственного процесса.
Установлено:
7.Выполнена проверка количества сокращённых объектов и их доли в общем числе исходных объектов
8.Установлено, что сокращение выборки составляет несколько процентов. Это допустимо.
Задачи:
Написать функцию для вычисления итоговой sMAPE.
Обучить разные модели и оценить их качество кросс-валидацией. Выбрать лучшую модель и проверить её на тестовой выборке. Описать выводы.
Формулы для расчета метрик качества:
def smape_func(y_target, y_predict):
difference = np.abs(y_target - y_predict)
sum_ma = (np.abs(y_target) + np.abs(y_predict)) / 2
return np.mean(difference / sum_ma) * 100
def final_smape_func(rougher, final):
return 0.25 * rougher + 0.75 * final
smape_scorer = make_scorer(smape_func, greater_is_better=False)
# Создадим список колонок для обучающей (features) и тестовой () выборок:
#features_col = data['test'].columns[1:-2] - через индексы
# Создадим features не через индексы, а через названия колонок:
features_col = data['test'].columns.tolist()
features_col.remove('date')
features_col.remove('rougher.output.recovery')
features_col.remove('final.output.recovery')
targets_col = ["rougher.output.recovery","final.output.recovery"]
# Создадим тестовую выборку:
features_test = data['test'][features_col].reset_index(drop=True)
target_test = data['test'][targets_col].reset_index(drop=True)
print(features_test.shape, target_test.shape)
# Создадим обучающую выборку:
features_train = data['train'][features_col].reset_index(drop=True)
target_train = data['train'][targets_col].reset_index(drop=True)
print(features_train.shape, target_train.shape)
(5290, 52) (5290, 2) (12848, 52) (12848, 2)
Исследование проведем на следующих моделях:
%%time
model_dtree_rougher = DecisionTreeRegressor(random_state=RANDOM_FIX_NUMBER)
#params = {'max_depth':range(1,30)}
# Наилучшее значение 'max_depth' = 3. Поэтому можно ускорить работу GridSearchCV:
params = {'max_depth':range(3,4)}
grid_dt_rougher = GridSearchCV(model_dtree_rougher, params, cv=5, scoring=smape_scorer, verbose=1)
grid_dt_rougher.fit(features_train, target_train['rougher.output.recovery'])
print('Для таргета "rougher.output.recovery":')
print('Наилучшая модель "Дерево решений" c оценкой качества кросс-валидацией:', grid_dt_rougher)
print('Глубина дерева наилучшей модели "Дерево решений" с GridSearchCV:',
grid_dt_rougher.best_params_)
print('Метрика оценки качества sMAPE наилучшей модели "Дерево решений" c GridSearchCV": ',
round(abs(grid_dt_rougher.best_score_), 3))
Separating_line()
model_dtree_final = DecisionTreeRegressor(random_state=RANDOM_FIX_NUMBER)
# params = {'max_depth':range(1,30)}
# Наилучшее значение 'max_depth' = 2. Поэтому можно ускорить работу GridSearchCV:
params = {'max_depth':range(2,3)}
grid_dt_final = GridSearchCV(model_dtree_final, params, cv=5, scoring=smape_scorer, verbose=1)
grid_dt_final.fit(features_train, target_train['final.output.recovery'])
print('Для таргета "final.output.recovery":')
print('Наилучшая модель "Дерево решений" c оценкой качества кросс-валидацией:', grid_dt_final)
print('Глубина дерева наилучшей модели "Дерево решений" с GridSearchCV:',
grid_dt_final.best_params_)
print('Метрика оценки качества sMAPE наилучшей модели "Дерево решений" c GridSearchCV": ',
round(abs(grid_dt_final.best_score_), 3))
Separating_line()
print('Итоговое sMAPE наилучшей модели "Дерево решений" c GridSearchCV": ',
round(final_smape_func(abs(grid_dt_rougher.best_score_), abs(grid_dt_final.best_score_)), 3))
Separating_line()
Fitting 5 folds for each of 1 candidates, totalling 5 fits
Для таргета "rougher.output.recovery":
Наилучшая модель "Дерево решений" c оценкой качества кросс-валидацией: GridSearchCV(cv=5, estimator=DecisionTreeRegressor(random_state=12345),
param_grid={'max_depth': range(3, 4)},
scoring=make_scorer(smape_func, greater_is_better=False),
verbose=1)
Глубина дерева наилучшей модели "Дерево решений" с GridSearchCV: {'max_depth': 3}
Метрика оценки качества sMAPE наилучшей модели "Дерево решений" c GridSearchCV": 7.102
--------------------------------------------------------------------------------
Fitting 5 folds for each of 1 candidates, totalling 5 fits
Для таргета "final.output.recovery":
Наилучшая модель "Дерево решений" c оценкой качества кросс-валидацией: GridSearchCV(cv=5, estimator=DecisionTreeRegressor(random_state=12345),
param_grid={'max_depth': range(2, 3)},
scoring=make_scorer(smape_func, greater_is_better=False),
verbose=1)
Глубина дерева наилучшей модели "Дерево решений" с GridSearchCV: {'max_depth': 2}
Метрика оценки качества sMAPE наилучшей модели "Дерево решений" c GridSearchCV": 9.151
--------------------------------------------------------------------------------
Итоговое sMAPE наилучшей модели "Дерево решений" c GridSearchCV": 8.638
--------------------------------------------------------------------------------
CPU times: total: 1.45 s
Wall time: 1.46 s
Для экономии времени на вычисления, привожу свои результаты:
Fitting 5 folds for each of 4 candidates, totalling 20 fits
Fitting 5 folds for each of 4 candidates, totalling 20 fits
я таргета "final.output.recovery":
Итоговое sMAPE наилучшей модели "Дерево решений" c GridSearchCV": 8.638
CPU times: total: 4.97 s Wall time: 4.96 s
%%time
# Чтобы видеть, что процесс выполняется, поставим tqdm с разовым циклом:
for _ in tqdm(range(1)):
model_rf_rougher = RandomForestRegressor(random_state=RANDOM_FIX_NUMBER)
parameters = { 'max_depth': range(5,6),
'n_estimators': range(41, 42) }
grid_rf_rougher = GridSearchCV(model_rf_rougher, parameters, cv=5, scoring=smape_scorer, verbose=1)
grid_rf_rougher.fit(features_train, target_train['rougher.output.recovery'])
print('Для таргета "rougher.output.recovery":')
print('Наилучшая модель "Cлучайного леса" c оценкой качества кросс-валидацией:', grid_rf_rougher)
print('Лучшие параметры:', grid_rf_rougher.best_params_)
print('smape_rougher', abs(round(grid_rf_rougher.best_score_, 3)))
Separating_line()
for _ in tqdm(range(1)):
model_rf_final = RandomForestRegressor(random_state=RANDOM_FIX_NUMBER)
parameters = { 'max_depth': range(2,3),
'n_estimators': range(268, 269) }
grid_rf_final = GridSearchCV(model_rf_final, parameters, cv=5, scoring=smape_scorer, verbose=1)
grid_rf_final.fit(features_train, target_train['final.output.recovery'])
print('Для таргета "final.output.recovery":')
print('Наилучшая модель "Cлучайного леса" c оценкой качества кросс-валидацией:', grid_rf_final)
print('Лучшие параметры:', grid_rf_final.best_params_)
print('smape_rougher', abs(round(grid_rf_final.best_score_, 3)))
Separating_line()
print('Итоговое sMAPE наилучшей модели "Дерево решений" c GridSearchCV": ',
round(final_smape_func(abs(grid_rf_rougher.best_score_), abs(grid_rf_final.best_score_)), 3))
Separating_line()
0%| | 0/1 [00:00<?, ?it/s]
Fitting 5 folds for each of 1 candidates, totalling 5 fits
Для таргета "rougher.output.recovery":
Наилучшая модель "Cлучайного леса" c оценкой качества кросс-валидацией: GridSearchCV(cv=5, estimator=RandomForestRegressor(random_state=12345),
param_grid={'max_depth': range(5, 6),
'n_estimators': range(41, 42)},
scoring=make_scorer(smape_func, greater_is_better=False),
verbose=1)
Лучшие параметры: {'max_depth': 5, 'n_estimators': 41}
smape_rougher 6.324
--------------------------------------------------------------------------------
0%| | 0/1 [00:00<?, ?it/s]
Fitting 5 folds for each of 1 candidates, totalling 5 fits
Для таргета "final.output.recovery":
Наилучшая модель "Cлучайного леса" c оценкой качества кросс-валидацией: GridSearchCV(cv=5, estimator=RandomForestRegressor(random_state=12345),
param_grid={'max_depth': range(2, 3),
'n_estimators': range(268, 269)},
scoring=make_scorer(smape_func, greater_is_better=False),
verbose=1)
Лучшие параметры: {'max_depth': 2, 'n_estimators': 268}
smape_rougher 9.02
--------------------------------------------------------------------------------
Итоговое sMAPE наилучшей модели "Дерево решений" c GridSearchCV": 8.346
--------------------------------------------------------------------------------
CPU times: total: 2min 8s
Wall time: 2min 8s
Для экономии времени на вычисления, привожу свои результаты:
1. Результаты расчета по модели 'Случайный лес' c param_grid={'max_depth': range(1, 10), 'n_estimators': range(1, 300, 10)}
Для таргета "rougher.output.recovery":
Для таргета "final.output.recovery":
Итоговое sMAPE наилучшей модели "Дерево решений" c GridSearchCV": 8.921
CPU times: total: 6h 23min 44s Wall time: 6h 23min 51s
2. Результаты расчета по модели 'Случайный лес' c param_grid={'max_depth': range(5, 6), 'n_estimators': range(35, 45)}
Для таргета "rougher.output.recovery":
Наилучшая модель "Cлучайного леса" c оценкой качества кросс-валидацией: GridSearchCV(cv=5, estimator=RandomForestRegressor(random_state=12345), param_grid={'max_depth': range(5, 6), 'n_estimators': range(35, 45)}, scoring=make_scorer(smape_func, greater_is_better=False), verbose=1)
Лучшие параметры: {'max_depth': 5, 'n_estimators': 41}
smape_rougher 6.324
Для таргета "final.output.recovery":
Наилучшая модель "Cлучайного леса" c оценкой качества кросс-валидацией: GridSearchCV(cv=5, estimator=RandomForestRegressor(random_state=12345), param_grid={'max_depth': range(2, 3), 'n_estimators': range(260, 300)}, scoring=make_scorer(smape_func, greater_is_better=False), verbose=1)
Лучшие параметры: {'max_depth': 2, 'n_estimators': 268}
smape_rougher 9.02
Итоговое sMAPE наилучшей модели "Дерево решений" c GridSearchCV": 8.346
CPU times: total: 50min 26s Wall time: 50min 28s
for _ in tqdm(range(1)):
model_line_reg_rougher = LinearRegression()
scores_line_reg_rougher = cross_val_score(model_line_reg_rougher,
features_train,
target_train['rougher.output.recovery'],
scoring = smape_scorer,
cv = 5)
smape_rougher = np.mean(abs(scores_line_reg_rougher))
print('Средняя оценка качества sMape_rougher', round(smape_rougher, 4))
Separating_line()
for _ in tqdm(range(1)):
model_line_reg_final = LinearRegression()
scores_line_reg_final = cross_val_score(model_line_reg_final,
features_train,
target_train['final.output.recovery'],
scoring = smape_scorer,
cv = 5)
smape_final = np.mean(abs(scores_line_reg_final))
print('Средняя оценка качества sMape_final', round(smape_final, 4))
Separating_line()
print('Итоговое sMAPE наилучшей модели "Линейная регрессия" c GridSearchCV": ',
round(final_smape_func(abs(smape_rougher), abs(smape_final)), 3))
Separating_line()
0%| | 0/1 [00:00<?, ?it/s]
Средняя оценка качества sMape_rougher 7.4825 --------------------------------------------------------------------------------
0%| | 0/1 [00:00<?, ?it/s]
Средняя оценка качества sMape_final 11.0976 -------------------------------------------------------------------------------- Итоговое sMAPE наилучшей модели "Линейная регрессия" c GridSearchCV": 10.194 --------------------------------------------------------------------------------
Для экономии времени на вычисления, привожу свои результаты:
Средняя оценка качества sMape_rougher 7.4825
Средняя оценка качества sMape_final 11.0976
Итоговое sMAPE наилучшей модели "Линейная регрессия" c GridSearchCV": 10.194
%%time
from imblearn.pipeline import make_pipeline as make_imblearn_pipeline
from sklearn.compose import make_column_transformer
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform
estimators_range = uniform(230,260).rvs(10000, random_state=RANDOM_FIX_NUMBER).astype(int)
max_depth_range = uniform(5,7).rvs(10000, random_state=RANDOM_FIX_NUMBER).astype(int)
pipeline = make_imblearn_pipeline(RandomForestClassifier())
pipeline.steps[-1] = ('clf', pipeline.steps[-1][1])
param_grid = [
{
'clf': [DecisionTreeRegressor(random_state=RANDOM_FIX_NUMBER)],
'clf__max_depth': max_depth_range
},
{
'clf': [RandomForestRegressor(random_state=RANDOM_FIX_NUMBER)],
'clf__n_estimators': estimators_range,
'clf__max_depth': max_depth_range,
},
{ 'linearregression': [LinearRegression()],
'columntransformer__pipeline__standardscaler': [MinMaxScaler(),
StandardScaler()],
}
]
grid_search = RandomizedSearchCV(pipeline,
param_grid,
n_iter=30,
cv=5,
scoring = smape_scorer,
random_state=RANDOM_FIX_NUMBER,
)
grid_search.fit(features_train, target_train['rougher.output.recovery'])
print('\nДля таргета "rougher.output.recovery":')
Separating_line()
print('best_params :', grid_search.best_params_)
Separating_line()
print('best_score :', grid_search.best_score_)
Separating_line()
smape_rougher = abs(grid_search.best_score_)
print('Средняя оценка качества sMape_rougher', round(smape_rougher, 4))
#print('cv_results :', grid_search.cv_results_)
grid_search.fit(features_train, target_train['final.output.recovery'])
print('\nДля таргета "final.output.recovery":')
Separating_line()
print('best_params :', grid_search.best_params_)
Separating_line()
print('best_score :', grid_search.best_score_)
Separating_line()
smape_final = abs(grid_search.best_score_)
print('Средняя оценка качества sMape_final', round(smape_final, 4))
#print('cv_results :', grid_search.cv_results_)
print('\nИтоговое sMAPE наилучшей модели "Pipeline" c GridSearchCV": ',
round(final_smape_func(abs(smape_rougher), abs(smape_final)), 3))
Separating_line()
Для таргета "rougher.output.recovery":
--------------------------------------------------------------------------------
best_params : {'clf__n_estimators': 236, 'clf__max_depth': 6, 'clf': RandomForestRegressor(max_depth=6, n_estimators=236, random_state=12345)}
--------------------------------------------------------------------------------
best_score : -6.258859141066537
--------------------------------------------------------------------------------
Средняя оценка качества sMape_rougher 6.2589
Для таргета "final.output.recovery":
--------------------------------------------------------------------------------
best_params : {'clf__n_estimators': 257, 'clf__max_depth': 5, 'clf': RandomForestRegressor(max_depth=5, n_estimators=257, random_state=12345)}
--------------------------------------------------------------------------------
best_score : -9.004802301532887
--------------------------------------------------------------------------------
Средняя оценка качества sMape_final 9.0048
Итоговое sMAPE наилучшей модели "Линейная регрессия" c GridSearchCV": 8.318
--------------------------------------------------------------------------------
CPU times: total: 1h 25min 6s
Wall time: 1h 25min 9s
Для экономии времени на вычисления, привожу свои результаты:
1.Для таргета "rougher.output.recovery":
2.Для таргета "final.output.recovery":
Итоговое sMAPE наилучшей модели "Pipeline" c "RandomizedSearchCV": 8.318
CPU times: total: 1h 25min 6s Wall time: 1h 25min 9s
Отмечаем:
1.Для лучшей модели, рассчитанной Pipeline, значение метрики 'Итоговое_sMAPE' c "RandomizedSearchCV" равно 8.318, что чуть лучше значения этой метрики для наилучшей модели "Дерево решений" c GridSearchCV": 8.346.
2.Наилучшими являются следующие модели:
# Расчет по модели 'Случайный лес'
predictions_r = grid_rf_rougher.predict(features_test)
predictions_f = grid_rf_final.predict(features_test)
print('Итоговое sMAPE на тестовой выборке по модели "Случайный лес":')
round(final_smape_func(smape_func(target_test['rougher.output.recovery'], predictions_r),
smape_func(target_test['final.output.recovery'], predictions_f)), 3)
# 8.948
Итоговое sMAPE на тестовой выборке по модели "Случайный лес":
8.948
# Расчет по модели 'Дерево решений'
predictions_dtree_r = grid_dt_rougher.predict(features_test)
predictions_dtree_f = grid_dt_final.predict(features_test)
print('Итоговое sMAPE на тестовой выборке по модели "Дерево решений" (для самопроверки):')
round(final_smape_func(smape_func(target_test['rougher.output.recovery'], predictions_dtree_r),
smape_func(target_test['final.output.recovery'], predictions_dtree_f)), 3)
# 9.626
Итоговое sMAPE на тестовой выборке по модели "Дерево решений" (для самопроверки):
9.626
Лучшая модель 'Случайный лес' и есть лучшая!
model_dum_recovery = DummyRegressor(strategy="median")
model_dum_recovery.fit(features_train, target_train['rougher.output.recovery'])
predictions_recovery = model_dum_recovery.predict(features_test)
model_dum_final = DummyRegressor(strategy="median")
model_dum_final.fit(features_train, target_train['final.output.recovery'])
predictions_final = model_dum_final.predict(features_test)
#final_smape_func(smape_func(target_test['rougher.output.recovery'], predictions_recovery),
# smape_func(target_test['final.output.recovery'], predictions_final))
print('Итоговое sMAPE на константной модели:')
round(final_smape_func(smape_func(target_test['rougher.output.recovery'], predictions_recovery),
smape_func(target_test['final.output.recovery'], predictions_final)), 3)
# 9.486
Итоговое sMAPE на константной модели:
9.486
Проверка модели на адекватность:
Ошибка на тестовой выборке разумная. Она меньше, чем на константной модели.
Модель 'Дерево решений' c подбором параметра глубины.
Для таргета "rougher.output.recovery":
Для таргета "final.output.recovery":
Итоговое_sMAPE наилучшей модели "Дерево решений" c GridSearchCV": 8.638.
Модель 'Cлучайного леса' c подбором параметров.
Для таргета "rougher.output.recovery":
Для таргета "final.output.recovery":
Итоговое sMAPE наилучшей модели "Cлучайного леса" c GridSearchCV": 8.346.
Модель 'Линейной регрессии'.
Итоговое_sMAPE наилучшей модели "Линейная регрессия" c GridSearchCV": 10.194.
Модель 'Pipeline'.
Для лучшей модели, рассчитанной Pipeline, значение метрики 'Итоговое_sMAPE' c "RandomizedSearchCV" равно 8.318, что чуть лучше значения этой метрики для наилучшей модели "Дерево решений" c GridSearchCV": 8.346.
Для таргета "rougher.output.recovery":
Для таргета "final.output.recovery":
Итоговое_sMAPE наилучшей модели "Pipeline" c RandomizedSearchCV": 8.318.
Итоговое_sMAPE: 8.948.
Итоговое_sMAPE: 9.486.
Ошибка на тестовой выборке меньше, чем на константной модели. Модель - адекватная.
По результатам исследования можно отметить следующие факты и сделать следующие выводы:
1.От компании «Цифра» получены данные с контрольными измерениями по ходу технологического процесса: * концентраций Au, Ag, Pb от исходного сырья до конечного концентрата, * информация по составу и количеству флотационных реагентов, * другим производственным характеристикам.
2.Данные подготовлены для дальнейшего анализа.
3.Проверена и подтверждена правильность расчёта эффективности обогащения.
4.Изучено распределение пропущенных значений по времени:
5.Исследована динамика изменения содержаний металлов (Au, Ag, Pb) в рудных материалах на всех стадиях производственного процесса. Отмечено: * Концентрации Au и Pb увеличиваются. * Серебро теряется. Видимо на предприятии нет задачи по выделению серебра из руды. Упущенная выгода при этом оценена в 0.5 млрд рублей ежегодно.
6.Изучено такая характеристика, как размер гранул рудных материалов ‘До’ и ‘После’ процесса флотации. В среднем их размер уменьшается в 10 раз.
7.Исследована динамика изменения содержаний металлов (Au, Ag, Pb) в так называемых ‘хвостах’. т.е. отходах. Отмечено, что в отходы попадают материалы с очень большими содержаниями и золота, и серебра. Это информация для технологов.
8.По динамике суммарного содержания всех металлов на разных стадиях очистки и концентрирования металлов можно говорить о том, что суммарная концентрация всех трех металлов увеличивается с каждым этапом техпроцесса, а следовательно, очистка металлов проводится успешно.
9.По распределению эффективности обогащения сырья и готового концентрата сделано заключение, что процесс флотации эффективнее, чем последующая очистка.
10.Созданы функции для расчёта метрик: sMAPE и Итоговое_sMAPE.
11.Собраны обучающая и тестовая выборки для построения моделей.
12.Построена модель 'Дерево решений' c подбором параметра глубины дерева. Итоговое_sMAPE наилучшей модели "Дерево решений" c GridSearchCV" равно 8.638.
13.Создана модель 'Cлучайного леса' c автоматическим подбором параметров глубина дерева и количество деревьев. Итоговое_sMAPE наилучшей модели 'Cлучайного леса' c GridSearchCV" равно 8.346.
14.Построена модель 'Линейной регрессии'. Итоговое_sMAPE равно 10.194.
15.Методом Pipeline построена и рассчитана лучшая модель, c автоматическим подбором параметров глубина дерева и количество деревьев. Итоговое_sMAPE наилучшей модели "Pipeline" c RandomizedSearchCV": 8.318.
16.В качестве лучшей выбрана модель 'Cлучайного леса', рассчитанная Pipeline. ‘Итоговое_sMAPE’ = 8.318
17.Лучшая модель проверена на тестовой выборке. ‘Итоговое_sMAPE’ = 8.948.
18.Проведена проверка модели на адекватность. ‘Итоговое_sMAPE’ = 9.486, что больше, чем на тестовой выборке. Ошибка на тестовой выборке разумная.
19.Для золотодобывающего горно-обогатительного комбината можно рекомендовать модель 'Cлучайного леса', рассчитанная Pipeline.